日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

扩展WCF的消息分发行为

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 扩展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、實現IDispatchMessageInspector2、實現Attribute, IServiceBehavior, IEndpointBehavior3、BehaviorExtensionElement中加入實現的ServiceBehaviorEndPointBehavior4、在配置文件中加入擴展行為

?

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中加入實現的ServiceBehaviorEndPointBehavior

?

代碼 ?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的消息分发行为的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。