2012-04-20 10 views
10

私はいくつかの方法で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をどのように送信するのですか?

+0

WCFで組み込みのトレース機能を使用できない理由は何ですか? http://msdn.microsoft.com/en-us/library/ms733025.aspx – DaveRead

+0

@DaveRead主に私がそれを認識していない - これは私がデータベースに私のログを保存することができますか? – Maloric

+0

すぐには使えませんが、独自のカスタムTraceListenerを作成することもできます。詳細については、この記事を参照してください。http://msdn.microsoft.com/en-gb/magazine/cc300790.aspx – DaveRead

答えて

19

私は他の人にも役立つかもしれない解決策を見つけた

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>(); 
    } 

。 MessageInspectorを作成すると、以下のとおり、「AfterReceiveRequest」と「BeforeSendReply」イベントにコードを添付することができます:

public class MessageInspector : IDispatchMessageInspector 
{ 
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 
     request = buffer.CreateMessage(); 
     LogMessage("Received:\n{0}", buffer.CreateMessage().ToString()); 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue); 
     reply = buffer.CreateMessage(); 
     LogMessage("Sending:\n{0}", buffer.CreateMessage().ToString()); 
    } 
} 

full tutorial for setting up message inspectors fo wcf hereあります。 app.config/web.configにビヘイビア拡張を追加するときに、完全修飾アセンブリ名を確認するように注意してください。

他の誰かがこれを見つけることを望みます。

2

あなたは上記の下図のようにあなたの方法を変更する必要が達成するために:より多くの情報を約Using Message Class

+0

ありがとうございます、これは正しい軌道に乗っていますが、 svcutil.exeを使用してプロキシクラスを作成する際にエラーが発生しました。 は 'WSDLをインポートすることはできません:binding' は' WSDLをインポートすることはできません: binding' ...など にも、私がリクエストボディから追加のオブジェクトを取得するかどうかはわかりません(私の例では、1つのオブジェクトのみが含まれ、実際のコードにはクライアントを識別する追加の文字列があります)。 月曜日にもう一度見ていきますが、今までのご協力に感謝します。 – Maloric

2

私はあなたが使うことができると思います...ToString()方法とそれがやる内部でメッセージを書き換えている:... ToString()メソッド内

string soap = OperationContext.Current.RequestContext.RequestMessage.ToString(); 

ルックを、WCFサービスプロジェクトのVS2015で)

0

、あなたがウェブ上で右クリックすることができますWCF構成を編集するには.configを使用します。ここから診断を有効にして、生のメッセージをログに記録することができます。

+0

これについて詳しく説明し、正確な設定と設定方法を指定できますか?単にこの文を作るだけでは十分ではありません。 –

関連する問題