1 引言
上回说到自定义扩展的第一步,是需要声明行为的类型。也就是通过实现一个行为接口,实现接口中的方法来声明行为的类型。
2 附件自定义行为到Operaiton或者是Endpoint
实现自定义的行为,第二步就是将自定义的行为类挂(
附加)到一个Operation或者是Endpoint上去。
自定义的行为如果是和操作有关,就附加到一个operation上;如果和具体的操作没有关系,就附加到一个endpoint上。
附加到操作需要实现System.ServiceModel.Description.IOperationBehavior接口。如果是附加到endpoint上,需要实现System.ServiceModel.Description.IEndpointBehavior接口。
如果是一个实现System.ServiceModel.Dispatcher.IClientMessageFormatter的对象,功能是序列化传输到服务端的数据。按照定义,这是一个操作相关的功能。(可以参考上一篇的定义
WCF扩展:行为扩展Behavior Extension<一>)
3 通知WCF有关自定义行为的信息
实现自定义的行为,最后需要做的就是将这个行为通知WCF。让WCF知道这个行为的存在。有两种方法可以实现通知:代码和配置。
4 自定义行为示例
下面让我们来实现一个简单的自定义行为
4.1 声明
我们声明一个客户端的消息检查行为类
public
class MyClientMessageInspector:IClientMessageInspector { #region IClientMessageInspector Members
public
void AfterReceiveReply(
ref System.ServiceModel.Channels.Message reply,
object correlationState) { }
public
object BeforeSendRequest(
ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) {
return
null; } #endregion }
4.2 附加
将自定义的message inspector行为附加到客户端的运行时,附加到客户端运行时client runtime的endpoint层面。
public
class MyClientMessageInspector:IClientMessageInspector,IEndpointBehavior { #region IClientMessageInspector Members
public
void AfterReceiveReply(
ref System.ServiceModel.Channels.Message reply,
object correlationState) { }
public
object BeforeSendRequest(
ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) {
return
null; } #endregion #region IEndpointBehavior Members
public
void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { }
public
void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { clientRuntime.MessageInspectors.Add(
this); }
public
void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { }
public
void Validate(ServiceEndpoint endpoint) { } #endregion }
4.3 通知
有两种方式来通知WCF这个自定义行为。
1 代码的方式
因为需要添加到客户端的运行时,所以需要在客户端的代码中添加。
public
interface IWcfClient { }
public
class WcfClient:ClientBase<IWcfClient >,IWcfClient {
public WcfClient(
string endpointConfigurationName):
base(endpointConfigurationName ) {
base.Endpoint.Behaviors.Add(
new Insfrastructures.MyClientMessageInspector()); } }
就是在构造函数中添加自定义的行为。
2 通过自定义配置节的配置的方式
让我们先定义一个行为扩展配置节的类
public
class MyBehaviorExtensionElement:BehaviorExtensionElement {
public
override Type BehaviorType {
get {
return
typeof(MyClientMessageInspector); } }
protected
override
object CreateBehavior() {
return
new MyClientMessageInspector(); } }
然后再客户端的config文件中添加
<?xml version="
1.0" encoding="
utf-8" ?> <configuration> <system.serviceModel> <client> <endpoint address="
http://localhost:8000/SimpleService/Endpoint" behaviorConfiguration="
SimpleServiceEndpointBehavior" binding="
customBinding" bindingConfiguration="
SimpleServiceBinding" contract="
Extensibility.ISimple" name="
SimpleService" /> </client> <behaviors> <endpointBehaviors> <behavior name="
SimpleServiceEndpointBehavior"> <myMessageInspector /> </behavior> </endpointBehaviors> </behaviors> <bindings> <customBinding> <binding name="
SimpleServiceBinding"> <httpTransport/> </binding> </customBinding> </bindings> <extensions> <behaviorExtensions> <add name="
myMessageInspector" type="
Insfrastructures .MyBehaviorExtensionElement, Insfrastructures .Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=
null"
/> </behaviorExtensions> </extensions> </system.serviceModel> </configuration>
本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/411490,如需转载请自行联系原作者