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配置节中指定使用扩展中的行为。
分享到:
相关推荐
本期MSDN杂志的主要内容有:<br><br>• 自己动手: 创建 .NET Framework 语言编译器<br><br>• WinUnit: 简化的本机 C++ 应用程序单元测试<br><br>• Silverlight: 创建自定义 Expression Encoder 发布插件<br><br>•...
<behavior> <serviceCredentials> <clientCertificate> <authentication certificateValidationMode="Custom" customCertificateValidatorType="YourNamespace.CustomCertificateValidator, YourAssembly" /> ...
<behavior name="webBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> ``` 现在,服务已经准备就绪,可以使用jQuery进行调用了。在HTML页面中,首先引入jQuery库...
<behavior name="Internet"> <serviceMetadata httpGetEnabled="false" /> </behavior> <behavior> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="true" /> </...
<behavior> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <webHttpBinding> <binding ...
<behavior> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior> <web...
<behavior> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior> <webHttp /> </...
<behavior> <!-- 为了防止泄露元数据,取消注释以下行 --> <!-- <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True" /> --> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior...
<extension element=<your_custom_behavior_extension/> /> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> ``` `WebHttpBehaviorExtensions-master` 这个文件夹很可能包含了实现这个...
本期的主要内容:<br><br>移动 WCF: 使用 .NET Compact Framework 编写 IM 应用程序<br>.NET Compact Framework 3.5 是 Windows Communication Foundation (WCF) 的功能子集,可以用来控制 Windows Mobile 设备与...
<behavior> <!-- 设置为true可以启用元数据发布,用于客户端生成代理 --> <serviceMetadata httpGetEnabled="true"/> <!-- 用于错误报告和调试 --> <serviceDebug includeExceptionDetailInFaults="false"/> ...
<behavior name="webBehavior"> <webHttp defaultOutgoingResponseFormat="Json" /> </behavior> </endpointBehaviors> </behaviors> ... </system.serviceModel> ``` 3. **添加跨域支持**:在WCF服务中,...
<object id="wcfService" type="YourNamespace.WcfService, YourAssembly"> <property name="SessionFactory" ref="sessionFactory" /> </object> </objects> ``` 接下来,我们需要创建NHibernate的配置文件(如...
<behavior name="webBehavior"> <webHttp defaultOutgoingResponseFormat="Json" helpEnabled="true" /> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior> <!-- 忽略此处的其他配置 --> </...
<behavior> <serviceCredentials> <clientCertificate> <!-- 配置客户端证书相关设置 --> </clientCertificate> <serviceCertificate> <!-- 配置服务端证书相关设置 --> </serviceCertificate> </service...
在WCF服务配置文件(.config)中,可以通过修改`<bindings>`和`<behaviors>`元素来指定使用的序列化器。例如,使用以下配置启用DataContractSerializer: ```xml <bindings> <basicHttpBinding> <binding name=...
<behavior name="webBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> ``` **4. 使用Ajax调用WCF服务** 在客户端,我们通常使用JavaScript库如jQuery来实现Ajax...
<behavior name="ajaxBehavior"> <webHttp defaultOutgoingResponseFormat="Json" /> </behavior> </endpointBehaviors> </behaviors> <services> <service name="YourNamespace.WcfAjaxService"> <endpoint...