2012-04-25 13 views
8

Mogę sprawdzać komunikaty WCF po stronie klienta i po stronie serwera przy użyciu odpowiednio IClientMessageInspector, IDispatchMessageInspector. Ale w komunikacji dwustronnej nie jest jasne, jak to zrobić w oddzwanianiu od serwera do klienta (Brak dokumentacji na ten temat).Sprawdź komunikaty WCF w kierunku oddzwonienia?

Wszelkie pomysły na temat sposobu wdrożenia tej funkcji?

+0

Mam również do czynienia z tym samym problemem. – Anuraj

Odpowiedz

6

Wreszcie dostaję rozwiązanie.

W scenariuszu komunikacji dwustronnej po wywołaniu wywołania serwer staje się klientem i odwrotnie.

Po stronie serwera podczas implementacji IServiceBehavior należy wprowadzić inspektora komunikatów za pomocą właściwości CallbackClientRuntime obiektu DispatchRuntime na foreach EndpointDispatcher.

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()); 
     } 
    } 
} 

po stronie klienta przy wdrażaniu IEndpointBehavior wstrzyknąć inspektora wiadomość używając 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());  
} 

Następnie zastosuj przedłużenie jak zawsze.

W moim przypadku stworzył klasę jak w poniższym kodzie pseudo

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

wtedy zastosować ten atrybut usługiwać implementację kontroli po stronie serwera i dodaje behaviorExtensions wewnątrz app.config w konfiguracji punkt końcowy do kontroli wiadomości po stronie klienta.

<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> 
Powiązane problemy