Проверять сообщения WCF в направлении обратного вызова?

Я могу проверять сообщения WCF как на стороне клиента, так и на стороне сервера, используя IClientMessageInspector, IDispatchMessageInspector соответственно. Но в дуплексных коммуникациях не ясно, как это сделать при обратном вызове с сервера на клиент (не так много документации по этой теме).

Любые идеи о том, как реализовать эту функцию?

1 ответ

Решение

Наконец-то я получил решение.

В сценарии дуплексной связи, когда выполняется обратный вызов, сервер становится клиентом, и наоборот.

Таким образом, на стороне сервера при реализации IServiceBehavior внедрите инспектор сообщений, используя свойство CallbackClientRuntime из функции DispatchRuntime 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());
        }
    }
}

На стороне клиента при реализации 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 entityExtensions для настройки конечной точки для проверки сообщений на стороне клиента.

<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>
Другие вопросы по тегам