いくつかの方法でWCFサービスを利用しています。送信方法に関係なく、クライアントからの生のリクエストをログに記録したいと思います。1つのメソッドは、データをクエリ文字列として受け入れます(厳密にはレガシーサポート用)。これを使用してログに記録できます。
OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri
そのシナリオではこれで十分ですが、他のメソッドを使用すると、クライアントはsvcutil.exeによって生成されたプロキシクラスを使用してデータをXMLとして送信できます。このシナリオでは、次のs:Bodyで必要なデータを見つけました。
OperationContext.Current.RequestContext.RequestMessage
残念ながら、何を試しても、メッセージを読み取る前に、バッファリングされたメッセージのコピーを作成することはできません。次に例を示します。
public CascadeResponse SendCustomer(Customer c)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
}
ただし、SendCustomerの最初の行で、次のエラーが発生します。
このメッセージは読み取られているため、操作をサポートできません。
これが私がバッファリングされたコピーを作成するポイントですよね?私はここで要素的に間違ったことをしていると思います。
編集:
さて、メソッドは次のようになりました。
public CascadeResponse SendCustomer(Message requestMessage)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
Customer c = msg.GetBody<Customer>();
string clientKey = "1111"; // This should be the clientKey string passed to the function along with the customer
return SendLead(c, clientKey);
}
私の問題は、CustomerとClientKeyを別々のエンティティとして送信する方法がわからないことです。clientKeyをCustomerのプロパティにすることもできます(または、データを渡すために特別に作成し、CustomerとClientKeyを属性として含むカスタムオブジェクトを作成することもできます)が、これはレガシーシステムのアップグレードであるため、可能であれば避けたいと思います。すでにこのように機能します。
また、svcUtil.exeを使用してプロキシクラスを作成するのに問題があります-上記のメソッドシグネチャがあると、サービスがリクエストを送信するための正しいシグネチャをアドバタイズしなくなると思いますか?それが十分に明確であるかどうかはわかりません-私の唯一の入力メソッドがMessageオブジェクトを受け入れる場合、クライアントはどのようにしてCustomerとClientKeyを送信することを知っていますか?