扩展WCF的消息分发行为
使用消息分發檢查器IDispatchMessageInspector、服務器行為IServiceBehavior、端點行為IEndpointBehavior擴展WCF的消息分發行為
Extend WCF dispatch message behavior with IDispatchMessageInspector IServiceBehavior, IEndpointBehavior ?
WCF從綁定的通道中接受到客戶端調用它的消息后,使用消息分發器將消息發給需要調用的操作。這個過程中我們在不修改原有WCF的程序也不需要加入標簽,只需要在WCF的配置文件中加入需要擴展的配置可以實現擴展WCF消息分發。
在我的上一篇博克中,我們可以攔截獲取操作參數,在操作調用前和調用后加入自己的擴展,但是這種方法需要在WCF契約的操作中加入標簽,這種方法我認為是一種“靜態植入”,這種方法需要重新編譯。
使用IParameterInspector, IOperationBehavior,Attribute(參數檢查器、操作行為接口和標簽)擴展WCF操作行為
地址:http://www.cnblogs.com/utopia/archive/2009/12/02/1615280.html
本文講述使用消息擴展,不需要重新編譯,修改配置文件就可以,應該是“動態攔截”的方法。
實現擴展消息分發需要4步:1、實現IDispatchMessageInspector;2、實現Attribute, IServiceBehavior, IEndpointBehavior;3、BehaviorExtensionElement中加入實現的ServiceBehavior和EndPointBehavior;4、在配置文件中加入擴展行為
?
1、實現IDispatchMessageInspector;
?
代碼 ?1????public?class?RelMsgInspector?:IDispatchMessageInspector
?2?????{???
?3?????????public?object?AfterReceiveRequest(
?4????????????ref?System.ServiceModel.Channels.Message?request,?IClientChannel?channel,?InstanceContext?instanceContext)
?5?????????{
?6?????????????MessageQueue?mq?=?new?MessageQueue(@".\private$\msgqueue");
?7?????????????mq.Send("RelSrv?get?msg?from?"+"channel.RemoteAddress.ToString()");
?8?????????????return?null;
?9?????????}
10?
11?????????public?void?BeforeSendReply(ref?System.ServiceModel.Channels.Message?reply,?object?correlationState)
12?????????{
13?????????????MessageQueue?mq?=?new?MessageQueue(@".\private$\msgqueue");
14?????????????mq.Send("RelSrv?sent?msg?to?"?+?"reply");
15?????????}
16?????}
?
2、實現Attribute, IServiceBehavior, IEndpointBehavior;
?
代碼 ?1??public?class?RelMsgValidation?:?Attribute,?IServiceBehavior,?IEndpointBehavior
?2?????{
?3?????????void?IServiceBehavior.AddBindingParameters(ServiceDescription?serviceDescription,
?4?????????????ServiceHostBase?serviceHostBase,
?5?????????????System.Collections.ObjectModel.Collection<ServiceEndpoint>?endpoints,
?6?????????????BindingParameterCollection?bindingParameters)
?7?????????{
?8?????????}
?9?????????void?IServiceBehavior.ApplyDispatchBehavior(ServiceDescription?serviceDescription,
10?????????????ServiceHostBase?serviceHostBase)
11?????????{
12?????????????WsdlExporter?wsdlExporter?=?new?WsdlExporter();
13?????????????wsdlExporter.ExportEndpoints(serviceDescription.Endpoints,
14?????????????????new?XmlQualifiedName(serviceDescription.Name,?serviceDescription.Namespace));
15?
16?????????????foreach?(ChannelDispatcher?cDispatcher?in?serviceHostBase.ChannelDispatchers)
17?????????????????foreach?(EndpointDispatcher?endpointDispatcher?in?cDispatcher.Endpoints)
18?????????????????????endpointDispatcher.DispatchRuntime.MessageInspectors.Add(
19?????????????????????????new?RelMsgInspector(?));
20?????????}
21?????????void?IServiceBehavior.Validate(ServiceDescription?serviceDescription,
22?????????????ServiceHostBase?serviceHostBase)
23?????????{
24?????????}
25?????????void?IEndpointBehavior.AddBindingParameters(ServiceEndpoint?endpoint,?BindingParameterCollection?bindingParameters)
26?????????{
27?????????}
28?????????void?IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint?endpoint,?ClientRuntime?clientRuntime)
29?????????{
30?????????}
31?????????void?IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint?endpoint,?EndpointDispatcher?endpointDispatcher)
32?????????{
33?????????????WsdlExporter?wsdlExporter?=?new?WsdlExporter();
34?????????????wsdlExporter.ExportEndpoint(endpoint);
35?????????????endpointDispatcher.DispatchRuntime.MessageInspectors.Add(
36?????????????????new?RelMsgInspector());
37?????????}
38?????????void?IEndpointBehavior.Validate(ServiceEndpoint?endpoint)
39?????????{
40?????????}
41?????}
?
3、BehaviorExtensionElement中加入實現的ServiceBehavior和EndPointBehavior;
?
代碼 ?1?????public?class?RelMsgBehaviorExtension?:?BehaviorExtensionElement
?2?????{
?3?????????public?override?Type?BehaviorType
?4?????????{
?5?????????????get?{?return?typeof(RelMsgValidation);?}
?6?????????}
?7?????????protected?override?object?CreateBehavior()
?8?????????{
?9?????????????return?new?RelMsgValidation();
10?????????}
11?????}
?
4、在配置文件中加入擴展行為
在配置中定義擴展
代碼 ????<extensions>??????<behaviorExtensions>
????????<add?name="RelMsgBehavior"?type="RelSrvExtends.RelMsgBehaviorExtension,?RelSrvExtends,?Version=1.0.0.0,?Culture=neutral,?PublicKeyToken=null"?/>
??????</behaviorExtensions>
????</extensions>
?
在Endpointbehavior 或 Servicebehavior中加入擴展
代碼
????<behaviors>??????<endpointBehaviors>
????????<behavior?name="RelSrvMsgBehavior">
??????????<RelMsgBehavior?/>
????????</behavior>
??????</endpointBehaviors>
??????<serviceBehaviors>
????????<behavior?name="DefaultBehavior">
??????????<serviceMetadata?httpGetEnabled="true"?httpsGetEnabled="false"?/>
??????????<serviceDebug?httpsHelpPageEnabled="true"?includeExceptionDetailInFaults="true"?/>
??????????<RelMsgBehavior?/>
????????</behavior>
??????</serviceBehaviors>
????</behaviors>
?
在Service和Endpoint的配置節中加入上面的behavior
?
代碼 <service?behaviorConfiguration="DefaultBehavior"?name="RelSrv.RelSrv">????????<endpoint?address=""?behaviorConfiguration="RelSrvMsgBehavior"
??????????binding="basicHttpBinding"?name="basicHttpBinding"?contract="RelSrvContract.IRelSrvContract"?/>
?
?當然我們也可以使用VS2008 自帶的 WCF 配置文件管理器 SvcConfigEditor.exe 來添加擴展:
配置中定義擴展
在Endpointbehavior 或 Servicebehavior中加入擴展
在Service和Endpoint的配置節中加入上面的behavior
轉載于:https://www.cnblogs.com/utopia/archive/2010/01/12/1644741.html
總結
以上是生活随笔為你收集整理的扩展WCF的消息分发行为的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHPCMS后台框架实现思路
- 下一篇: 面试系列三 如何保证消息不被重复消费