`

WCF扩展:行为扩展Behavior Extension<二>

    博客分类:
  • WCF
阅读更多

 

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>

 

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

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

相关推荐

    MSDN杂志 2008年第二期

    本期MSDN杂志的主要内容有:&lt;br&gt;&lt;br&gt;• 自己动手: 创建 .NET Framework 语言编译器&lt;br&gt;&lt;br&gt;• WinUnit: 简化的本机 C++ 应用程序单元测试&lt;br&gt;&lt;br&gt;• Silverlight: 创建自定义 Expression Encoder 发布插件&lt;br&gt;&lt;br&gt;•...

    WCF 消息压缩 自定义验证(X509证书指纹验证)

    &lt;behavior&gt; &lt;serviceCredentials&gt; &lt;clientCertificate&gt; &lt;authentication certificateValidationMode="Custom" customCertificateValidatorType="YourNamespace.CustomCertificateValidator, YourAssembly" /&gt; ...

    WCF JS 调用案例 Jquery调用案例

    &lt;behavior name="webBehavior"&gt; &lt;webHttp/&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; &lt;/system.serviceModel&gt; ``` 现在,服务已经准备就绪,可以使用jQuery进行调用了。在HTML页面中,首先引入jQuery库...

    wcf get、post配置

    &lt;behavior name="Internet"&gt; &lt;serviceMetadata httpGetEnabled="false" /&gt; &lt;/behavior&gt; &lt;behavior&gt; &lt;serviceMetadata httpGetEnabled="True"/&gt; &lt;serviceDebug includeExceptionDetailInFaults="true" /&gt; &lt;/...

    WCF服务宿主及其跨域问题解决实例

    &lt;behavior&gt; &lt;serviceMetadata httpGetEnabled="true" /&gt; &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; &lt;/behavior&gt; &lt;/serviceBehaviors&gt; &lt;/behaviors&gt; &lt;bindings&gt; &lt;webHttpBinding&gt; &lt;binding ...

    WCF 返回json 格式

    &lt;behavior&gt; &lt;serviceMetadata httpGetEnabled="true" /&gt; &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; &lt;/behavior&gt; &lt;/serviceBehaviors&gt; &lt;endpointBehaviors&gt; &lt;behavior&gt; &lt;web...

    WCF与AJAX交互DEMO

    &lt;behavior&gt; &lt;serviceMetadata httpGetEnabled="true" /&gt; &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; &lt;/behavior&gt; &lt;/serviceBehaviors&gt; &lt;endpointBehaviors&gt; &lt;behavior&gt; &lt;webHttp /&gt; &lt;/...

    创建WCF Restful

    &lt;behavior&gt; &lt;!-- 为了防止泄露元数据,取消注释以下行 --&gt; &lt;!-- &lt;serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" /&gt; --&gt; &lt;serviceDebug includeExceptionDetailInFaults="false" /&gt; &lt;/behavior...

    WCF + RESTful + 基本认证

    &lt;extension element=&lt;your_custom_behavior_extension/&gt; /&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; &lt;/system.serviceModel&gt; ``` `WebHttpBehaviorExtensions-master` 这个文件夹很可能包含了实现这个...

    MSDN杂志 2008年新产品特刊

    本期的主要内容:&lt;br&gt;&lt;br&gt;移动 WCF: 使用 .NET Compact Framework 编写 IM 应用程序&lt;br&gt;.NET Compact Framework 3.5 是 Windows Communication Foundation (WCF) 的功能子集,可以用来控制 Windows Mobile 设备与...

    WCF 入门教程二demo

    &lt;behavior&gt; &lt;!-- 设置为true可以启用元数据发布,用于客户端生成代理 --&gt; &lt;serviceMetadata httpGetEnabled="true"/&gt; &lt;!-- 用于错误报告和调试 --&gt; &lt;serviceDebug includeExceptionDetailInFaults="false"/&gt; ...

    wcf 跨域 post方式

    &lt;behavior name="webBehavior"&gt; &lt;webHttp defaultOutgoingResponseFormat="Json" /&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; ... &lt;/system.serviceModel&gt; ``` 3. **添加跨域支持**:在WCF服务中,...

    spring.net+Nhiberate实现WCF服务层

    &lt;object id="wcfService" type="YourNamespace.WcfService, YourAssembly"&gt; &lt;property name="SessionFactory" ref="sessionFactory" /&gt; &lt;/object&gt; &lt;/objects&gt; ``` 接下来,我们需要创建NHibernate的配置文件(如...

    安卓与wcf通信 json实现

    &lt;behavior name="webBehavior"&gt; &lt;webHttp defaultOutgoingResponseFormat="Json" helpEnabled="true" /&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;serviceBehaviors&gt; &lt;behavior&gt; &lt;!-- 忽略此处的其他配置 --&gt; &lt;/...

    WCF双向认证

    &lt;behavior&gt; &lt;serviceCredentials&gt; &lt;clientCertificate&gt; &lt;!-- 配置客户端证书相关设置 --&gt; &lt;/clientCertificate&gt; &lt;serviceCertificate&gt; &lt;!-- 配置服务端证书相关设置 --&gt; &lt;/serviceCertificate&gt; &lt;/service...

    WCF序列化案例

    在WCF服务配置文件(.config)中,可以通过修改`&lt;bindings&gt;`和`&lt;behaviors&gt;`元素来指定使用的序列化器。例如,使用以下配置启用DataContractSerializer: ```xml &lt;bindings&gt; &lt;basicHttpBinding&gt; &lt;binding name=...

    Ajax连接WCF

    &lt;behavior name="webBehavior"&gt; &lt;webHttp/&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; &lt;/system.serviceModel&gt; ``` **4. 使用Ajax调用WCF服务** 在客户端,我们通常使用JavaScript库如jQuery来实现Ajax...

    Wcf ajax c#例子

    &lt;behavior name="ajaxBehavior"&gt; &lt;webHttp defaultOutgoingResponseFormat="Json" /&gt; &lt;/behavior&gt; &lt;/endpointBehaviors&gt; &lt;/behaviors&gt; &lt;services&gt; &lt;service name="YourNamespace.WcfAjaxService"&gt; &lt;endpoint...

Global site tag (gtag.js) - Google Analytics