私はいくつかの方法でWCFサービスを持っています。私はどのようにこれが送られたかにかかわらずクライアントから来た生の要求を記録したいと思います。一つの方法は、私が使用してログインすることができた(厳密にレガシーサポートのための)クエリ文字列としてデータを受け取ります。そのシナリオでは十分であるが、他の方法は、クライアントが生成されたプロキシクラスを使用してXMLとしてデータを送信することができWCFサービスで生のリクエストを記録する方法
OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri
svcutil.exeによって。ボディの:
OperationContext.Current.RequestContext.RequestMessage
残念なことに、どんなに私はそれが読み込まれる前に、私は、メッセージのバッファリングのコピーを作成することはできませんしてみてください何このシナリオでは、私はSに必要なデータを発見しました。次に例を示します。SendCustomerの最初の行に
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
}
、しかし、私は次のエラーを取得する:それは読まれているため
このメッセージは、操作をサポートすることはできません。
これは私がバッファリングされたコピーを作成するのは間違いありませんか?私はここで要素的に何かをやっていると思います。
編集:
オクラホマので、この方法は次のようになりました:
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);
}
私の問題は、私は顧客を取得し、ClientKeyが別々のエンティティとして送信する方法がわからないということです。私はclientKeyをCustomerのプロパティにすることができます(または、データを渡すための特別なカスタムオブジェクトを作成し、CustomerおよびClientKeyを属性として含む)が、これを避けるために、可能であれば、これはレガシーシステムのアップグレードです。すでにこのように動作しています。
svcUtil.exeを使用してプロキシクラスを作成する際にも問題があります。上記のメソッドシグネチャを使用すると、サービスが要求を送信するための正しいシグネチャをアドバタイズしないことを意味します。それが十分明確であるかどうかはわかりません。私の唯一の入力メソッドがMessageオブジェクトを受け入れる場合、クライアントはCustomerとClientKeyをどのように送信するのですか?
WCFで組み込みのトレース機能を使用できない理由は何ですか? http://msdn.microsoft.com/en-us/library/ms733025.aspx – DaveRead
@DaveRead主に私がそれを認識していない - これは私がデータベースに私のログを保存することができますか? – Maloric
すぐには使えませんが、独自のカスタムTraceListenerを作成することもできます。詳細については、この記事を参照してください。http://msdn.microsoft.com/en-gb/magazine/cc300790.aspx – DaveRead