2012-04-25 89 views
8

我可以分別使用IClientMessageInspector,IDispatchMessageInspector檢查客戶端和服務器端的WCF消息。但在Duplex通信中,不清楚如何在從服務器到客戶端的回調中執行此操作(關於該主題的文檔也不多)。檢查回調方向的WCF消息?

有關如何實現此功能的任何想法?

+0

我也面臨同樣的問題。 – Anuraj 2012-04-26 09:58:33

回答

6

最後我得到解決方案。

在進行回調的雙工通信場景中,服務器成爲客戶端,反之亦然。

因此,在實現IServiceBehavior的服務器端,使用DispatchRuntime的foreach EndpointDispatcher的CallbackClientRuntime屬性注入消息檢查器。

public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
{ 
    foreach (ChannelDispatcher item in serviceHostBase.ChannelDispatchers) 
    { 
     foreach (EndpointDispatcher epd in item.Endpoints) 
     { 
      //injecting an inspector in normal call 
      epd.DispatchRuntime.MessageInspectors.Add(new MessageSizerInspector()); 

      //injecting an inspector in callback 
      epd.DispatchRuntime.CallbackClientRuntime.MessageInspectors.Add(new MessageSizerInspector()); 
     } 
    } 
} 

在客戶機側執行時IEndpointBehavior注入使用CallbackDispatchRuntime消息檢查。

public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
{ 
    //injecting an inspector in normal call 
    clientRuntime.MessageInspectors.Add(new MessageSizerInspector()); 

    //injecting an inspector in callback 
    clientRuntime.CallbackDispatchRuntime.MessageInspectors.Add(new MessageSizerInspector());  
} 

然後一如既往地應用擴展。

在我來說,我喜歡創建以下僞代碼

public class MessageSizer : Attribute, IServiceBehavior, IEndpointBehavior 
{ 
    ..... 
} 

然後我申請這個屬性以服務爲執行服務器端檢查 類,並增加了behaviorExtensions在app.config裏面設置端點用於客戶端的消息檢查。

<system.serviceModel> 
    ........... 
    <client> 
     <endpoint address="net.tcp://localhost/MinerDual.svc" 
      binding="netTcpBinding" bindingConfiguration="wsDualMinerNetTcp" 
      contract="WebApplication.IMinerDual" name="NetTcpMinerDual" 
      behaviorConfiguration="Default" /> 
    </client> 
    <behaviors> 
    <endpointBehaviors > 
     <behavior name="Default"> 
     <messageSizer/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <extensions> 
    <behaviorExtensions> 
     <add name="messageSizer" 
      type="WCFExtensions.MessageSizerElement, WCFExtensions, 
      Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </behaviorExtensions> 
    </extensions> 
</system.serviceModel>