17

私はwcfクライアントを持っています。要件に従って、リクエスト内のメタデータの一部 (およびリクエストに含まれていないユーザー データ) を記録する必要があります。次に、リクエストが成功した場合は、応答メタデータを記録する必要があり、フラグによっては、フルソープリクエスト。

これを正しい方法で実行しようとしています (IParameterInspector を使用してメタデータを調べ、IClientMessageInspector を使用して Soap を取得します) が、2 つのインターフェイス要求を関連付ける方法がありません。ここでのスレッドセーフについてはわかりません。これは、私がいる場所の簡素化されたバージョンです...

     public class SoapRequestInfo
{
    public string UserId { get; set; }
    public Guid Key { get; set; }
    //would contain a lot more info
}

public class OperationProfilerParameterInspector : IParameterInspector, IClientMessageInspector
{
    //before serialization
    public object BeforeCall(string operationName, object[] inputs) //IParameterInspector
    {
        //Add the operation, record some specific inputs to db
        return new SoapRequestInfo
                            {
                                UserId = "1234",
                                Key = new Guid()
                            };
    }

    public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState) //IParameterInspector
    {
       var info = correlationState as SoapRequestInfo;
        //Do some additional logging - easy enough
    }

    public object BeforeSendRequest(ref Message request, IClientChannel channel) //IClientMessageInspector
    {
        //want to correlate this with IParameterInspector
        return null;
    }


    public void AfterReceiveReply(ref Message reply, object correlationState) //IClientMessageInspector
    {
        //May want to log full soap message depending on after call criteria
    }
}      

Guid を保持するためにプライベート変数を使用できないことはわかっています。複数のリクエストが連続して発生する可能性があり、レスポンスが正しいことを保証できないため、セッションを使用できません。では、2 つのインターフェイス間のcorrelationState を一意に識別するにはどうすればよいでしょうか?

4

2 に答える 2

1

サービスが ASPNET 互換モードで実行されている場合は、おそらく HttpContext.Items を使用してオブジェクトを保持できます。それ以外の場合は、TLS (スレッド ローカル ストレージ) を使用し、データをスロットに入れ、後でフェッチ/クリアできます。

于 2015-08-30T10:17:18.503 に答える
-1

この少し違うことをするためにトロできるかもしれません:

この投稿から相関トークンを WCF サービスに渡しますか? :

WS-Addressing でメッセージ バージョンを使用する場合、各メッセージには自動生成された ID (guid) が含まれ、各応答には要求の ID も含まれるため、自動的にそれを取得する必要があります。OperationContext を介してこれらのヘッダーにアクセスできます。

メッセージの使用が要件に合わない場合は、リクエストを送信するときにヘッダーに独自の ID を入れて、おそらく同じ ID でレスポンスを更新することができます。

于 2013-11-21T08:28:52.793 に答える