がアタッチされているエンドポイントをプログラムで公開する WCF SOAP サービスがいくつかありますIEndPointBehavior
。
var endpoint = AddServiceEndpoint(contractType,
basicBinding,
address);
_logger.Write("Adding behavior for service {0}, contract: {1}", serviceName, cd.Value.ContractType);
endpoint.Behaviors.Add(new MyBehavior());
動作クラスで、メッセージ インスペクターを Dispatch ランタイムに追加します。
void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint,
EndpointDispatcher endpointDispatcher)
{
_logger.WriteError("Adding Inspector to endpoint {0}, contract {1}", endpoint.Address.ToString(), endpoint.Contract.Name);
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyInspector());
}
メッセージ インスペクタでは、次のAfterReceiveRequest
ようなメソッドを実装しました。
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
_logger.WriteError("AfterReceiveRequest for {0} via {1}", request.Headers.Action, request.Properties.Via);
// implementation omitted...
return null;
}
これで、すべてのサービスの「Adding behavior」と「Adding inspector」のログ メッセージが表示されますが、このAfterReceiveRequest
メソッドは一部のサービスに対してのみ呼び出されます。
メソッドが呼び出されていないサービスは、IIS の別の Web アプリケーションで実行されていますが、このインスペクターが機能しない理由を説明する別のものは見つかりません。インスペクターが機能していないサービスも別の基本クラスから派生していますが、その基本クラスからすべてのコードを取り出しましたが、メソッドはまだ呼び出されていません。
メッセージ トレースを有効にしたところ、クライアントが正しいエンドポイントを呼び出していることがわかりました。
なぜこれが起こるのか、またはこれをよりよくデバッグする方法を知っている人はいますか?