3

メソッドを公開する WCF サービスを実装してい[OperationContract]ます[XmlSerializerFormat]。本文が有効な XML ではないリクエストを受け取ることがあります。そのような場合、元の本文をログに記録したいので、有効な XML を構成しなかった理由を知ることができます。ただし、Message オブジェクトから取得することはできません。私の試行を参照してください (IDispatchMessageInspector インターフェイスを実装することによる):

    public object IDispatchMessageInspector.AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        request.ToString();  // "... Error reading body: System.Xml.XmlException: The data at the root level is invalid. Line 1, position 1. ..."
        request.WriteBody(...);   // Serialization Exception, also in WriteMessage and other Write* methods
        request.GetReaderAtBodyContents(...);   // Same
        HttpRequestMessageProperty httpRequest = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];  // no body in httpRequest
    }

ウォッチを見ると、request.messageData に本文が含まれているように見えますが、これはプライベート メンバーです。

逆シリアル化を試みずにメッセージ バッファを取得するにはどうすればよいですか?

4

2 に答える 2

2

はい、カスタム MessageEncoderが必要です。メッセージ インスペクタ (IDispatchMessageInspector / IClientMessageInspector) とは異なり、不正な形式の XML データを含む元のバイト コンテンツが表示されます。

ただし、このアプローチを実装する方法は簡単ではありません。標準のtextMessageEncodingをカスタムバインディング要素としてラップし、そのカスタム バインディングを使用するように構成ファイルを調整する必要があります。

また、私のプロジェクトでそれをどのように行ったかを例として見ることができます- textMessageEncoding のラッピング、エンコーダーのロギング、カスタムバインディング要素、およびconfig

于 2018-05-02T10:02:10.137 に答える
-1

アップデート

この問題に遭遇した他のユーザーは、Customer Message Encoderを作成したようです。

メッセージ エンコーディング バインディング要素は、送信メッセージをシリアル化してトランスポートに渡すか、シリアル化された形式のメッセージをトランスポートから受信し、存在する場合はプロトコル層に、存在しない場合はアプリケーションに渡します。

于 2012-07-23T12:10:02.587 に答える