2012-04-25 2 views
8

IClientMessageInspector, IDispatchMessageInspector를 사용하여 클라이언트 측과 서버 측 모두에서 WCF 메시지를 검사 할 수 있습니다. 그러나 Duplex 통신에서는 서버에서 클라이언트로 콜백하는 방법이 명확하지 않습니다.WCF 메시지를 콜백 방향으로 검사 하시겠습니까?

이 기능을 구현하는 방법에 대한 아이디어가 있으십니까?

+0

나는 또한 동일한 문제에 직면하고있다. – Anuraj

답변

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 
{ 
    ..... 
} 

같은 클래스를 생성 및 설정에의 app.config 내부의 엔드 포인트를 behaviorExtensions 추가 클라이언트 측의 메시지 검사 용.

<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>