8

IClientMessageInspector、IDispatchMessageInspector をそれぞれ使用して、クライアント側とサーバー側の両方で WCF メッセージを検査できます。しかし、デュプレックス通信では、サーバーからクライアントへのコールバックでそれを行う方法が明確ではありません (そのトピックに関するドキュメントもあまりありません)。

この機能を実装する方法についてのアイデアはありますか?

4

1 に答える 1

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>
于 2012-04-28T02:03:02.347 に答える