IClientMessageInspector、IDispatchMessageInspector をそれぞれ使用して、クライアント側とサーバー側の両方で WCF メッセージを検査できます。しかし、デュプレックス通信では、サーバーからクライアントへのコールバックでそれを行う方法が明確ではありません (そのトピックに関するドキュメントもあまりありません)。
この機能を実装する方法についてのアイデアはありますか?
IClientMessageInspector、IDispatchMessageInspector をそれぞれ使用して、クライアント側とサーバー側の両方で WCF メッセージを検査できます。しかし、デュプレックス通信では、サーバーからクライアントへのコールバックでそれを行う方法が明確ではありません (そのトピックに関するドキュメントもあまりありません)。
この機能を実装する方法についてのアイデアはありますか?
最後に、解決策を取得します。
二重通信シナリオでは、コールバックが行われるとサーバーがクライアントになり、その逆も同様です。
そのため、サーバー側で 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>