Проверять сообщения 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>