`

WCF扩展:行为扩展Behavior Extension

阅读更多

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 
{
   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文件中添加

<!--l version="<span style="color: #8b0000" mce_style="color: #8b000-->1.0" encoding="utf-8" ?>

    
        
            http://localhost:8000/SimpleService/Endpoint" 
				behaviorConfiguration="SimpleServiceEndpointBehavior"
				binding="customBinding"
                bindingConfiguration="SimpleServiceBinding" 
				contract="Extensibility.ISimple" 
				name="SimpleService" />
        
		
			
				SimpleServiceEndpointBehavior">
					
				
				
			
		
		
			
				SimpleServiceBinding">
					
				
			
		
		
			
				myMessageInspector"
					type="Insfrastructures
.MyBehaviorExtensionElement, Insfrastructures
.Server, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
			
		
    

在 配置节添加行为扩展的配置节。然后在endpoint的behavior配置节中指定使用扩展中的行为。

Technorati 标签: WCF,EXtension,BEhavior
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics