2

がアタッチされているエンドポイントをプログラムで公開する 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 アプリケーションで実行されていますが、このインスペクターが機能しない理由を説明する別のものは見つかりません。インスペクターが機能していないサービスも別の基本クラスから派生していますが、その基本クラスからすべてのコードを取り出しましたが、メソッドはまだ呼び出されていません。

メッセージ トレースを有効にしたところ、クライアントが正しいエンドポイントを呼び出していることがわかりました。

なぜこれが起こるのか、またはこれをよりよくデバッグする方法を知っている人はいますか?

4

2 に答える 2

2

私は最終的に自分のコードの問題を発見しました。両方の WCF サービスには、WIF (.NET 4.5)ClaimsAuthorizationManagerが接続されています。への呼び出しは、一方のサービスと他方のサービスに対してCheckAccess返されました。false を返すものは、エンドポイント動作の を呼び出すことはありませんでした。truefalseAfterReceiveRequest

Carlos Figueira の信じられないほど便利なコマンドライン ツールを WIFClaimsAuthenticationManagerで拡張したClaimsAuthorizationManagerところ、それらのメソッドAuthenticateCheckAccessメソッドが の前に呼び出されることがわかりましAfterReceiveRequestDispatchMessageInspector

CheckAccess の前に呼び出される拡張ポイントが必要だったので、実装するクラスを使用することになりました。IInstanceContextProvider

于 2015-10-08T03:40:21.690 に答える
0

しかし、私は IInstanceContextProvider を実装せずに動作させました。

于 2016-12-07T07:38:30.300 に答える