7

IIS/ASP.NET でホストされている WCF サービスがあり、シリアル化されたオブジェクトの HTTP ポスト (フォーム ポストではありません) を受け入れます。

クライアントが不正な形式のリクエストを送信した場合 (オブジェクトを正しくシリアル化していないなど)、送信されたメッセージをログに記録したいと思います。

未処理の例外をキャプチャするために既に ELMAH を使用しているため、単純に投稿データを添付するのが最も簡単なオプションです。

例外中に現在の HttpContext を取得できますが、これには HTTP ヘッダー情報しか含まれていません。

私の質問はこれです: 元の HTTP POST リクエスト本文をキャプチャする方法はありますか? または、それが失敗した場合 - エラーの原因となった入力をキャプチャするより良い方法 (リバース プロキシなし) はありますか?

編集:明確にするために、常にパケットレベルのキャプチャを実行することはあまり適していません。私は、実稼働サーバーに展開でき、クライアントが制御または監視できないソリューションを求めています。

編集 #2: Request.InputStream にアクセスするための提案が行われました - WCF がストリームから要求を読み取った後に読み取ろうとしている場合、これは機能しません。

これをどのように使用したかを確認するためのコードのサンプルは、こちらです。

        StringBuilder log = new StringBuilder();

        var request = HttpContext.Current.Request;

        if (request.InputStream != null)
        {
            log.AppendLine(string.Format("request.InputStream.Position = \"{0}\"", request.InputStream.Position));
            if (request.InputStream.Position != 0)
            {
                request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
            }

            using (StreamReader sr = new StreamReader(request.InputStream))
            {
                log.AppendLine(string.Format("Original Input: \"{0}\"", sr.ReadToEnd()));
            }
        }
        else
        {
            log.AppendLine("request.Inputstream = null");
        }


        log.ToString();

log.ToString() の出力は次のとおりです。

    request.InputStream.Position = "0"
    元の入力: ""
4

4 に答える 4

3

サービスに到達するまでに、リクエストは処理され、利用できなくなります。

ただし...メッセージインスペクタを添付できます。メッセージ インスペクターを使用すると、操作の実装に到達する前にメッセージをいじることができます。メッセージのバッファリングされたコピーを作成し、それを OperationContext.Current にコピーできます。

もちろん、醜いハックであり、リクエストごとにメッセージの2つのコピーが浮かんでいるため、メモリのオーバーヘッドが発生します。

于 2009-05-25T17:04:07.717 に答える
-1

ASP.NET (IIS の下の ASP Web サービス) の下から、次のコードが役立ちます。

if (request.InputStream.Position != 0)
{
  request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}

WCF は異なる可能性があります (つまり、読み取り後に InputStream を破棄します)。

于 2013-01-03T12:46:20.277 に答える
-1

System.Web.Request.InputStream プロパティを見ましたか? まさにあなたが望むものを持っているはずです。

InputStream プロパティを「巻き戻す」方法。

    if (Request.InputStream.Position != 0)
    {
        Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
    }

検討すべきもう 1 つのオプションは、BeginRequest イベントで HTTPModule を使用してこの情報をキャプチャすることです。PostAuthenticateEvent の後まで WCF が要求を取得するとは思わないため、データは BeginRequest イベントにあるはずです。

于 2009-05-25T13:56:28.690 に答える
-2

フィドラーを使用します。MSから無料。よく働く。

于 2009-05-25T13:45:16.280 に答える