私は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 を一意に識別するにはどうすればよいでしょうか?