【问题标题】:Inspect WCF Messages in the Callback direction?在回调方向检查 WCF 消息?
【发布时间】:2012-04-25 09:59:58
【问题描述】:

我可以分别使用 IClientMessageInspector、IDispatchMessageInspector 在客户端和服务器端检查 WCF 消息。但是在双工通信中,不清楚如何在从服务器到客户端的回调中做到这一点(关于该主题的文档也很少)。

关于如何实现此功能的任何想法?

【问题讨论】:

  • 我也面临同样的问题。

标签: wcf duplex-channel


【解决方案1】:

我终于得到了解决方案。

在双工通信场景中,当进行回调时,服务器成为客户端,反之亦然。

所以在服务器端实现 IServiceBehavior 时,使用每个 EndpointDispatcher 的 DispatchRuntime 的 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>

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多