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" 元の入力: ""