15

Elmahを使用して例外をログに記録しています。Elmahは、リクエストがフォームベースのリクエスト(つまり、Content-Type:application / x-www-form-urlencoded)の場合、リクエスト本文のログ記録に優れていますが、コンテンツタイプがapplication / jsonであるJSONベースのリクエストでは、リクエスト本文です。エラーレポートのどこにも見つかりません。例外を適切に診断できるように、このリクエスト本文をどこで見つけることができるか知っている人はいますか?

更新:2012-01-03

JSONベースのリクエストの意味を明確にするために、リクエストの本文としてJSONを使用した生のHTTPリクエストの例を次に示します。

PUT http://mycompany.com/api/v1.0/me HTTP/1.1
Host: mycompany.com
Content-Length: 20
Content-Type: application/json

{"city":"Vancouver"}
4

3 に答える 3

19

ELMAHはこれまで、リクエストの周辺にあり、標準的な方法で便利にキャプチャできるコンテキストまたは情報のみをログに記録します。MIMEタイプがである場合、ASP.NETは要求エンティティのデコードと記憶の仕事をすでに行っているため、フォームは間違いなく特別な扱いですapplication/x-www-form-urlencoded。一方、JSONリクエストは、例外が発生したときに、入力ストリーム(HttpRequest.InputStream)がJSONデコーダーによって部分的または完全に消費された可能性があるため、問題が発生します。ELMAHは、ロギングの目的で2番目のクラックを取得することはできません。したがって、入力ストリームまたはテキストをJSONデコーダーに渡す前にバッファーに入れて、のような場所に隠しておく必要がありますHttpContext.Items。次に、バッファリングされたデータの回復を試みて、エラー時に送信メールに添付してください。ELMAHは現在、ログに記録されたエラーへの任意のデータの添付をサポートしていません。ただし、ErrorLogModuleイベントがLoggedあり、ログに記録されたエラーのIDを提供するがあります。これは、入力データを他の場所(エラーログにバックエンドデータベースを使用している場合はおそらく別のテーブル)に格納するために使用できますが、IDを介して関連付けを維持することにより、ログに記録されたエラーに関連付けます。

于 2012-01-05T10:53:29.287 に答える
4

nugetパッケージの最初のインストール:Newtonsoft.Json

install-package Newtonsoft.Json

それから:

 public override void OnException(HttpActionExecutedContext filterContext)
        {
    var message = new StringBuilder();
            foreach (var param in filterContext.ActionContext.ActionArguments)
            {
                message.Append(string.Format("{0}:{1}\r\n", param.Key, Newtonsoft.Json.JsonConvert.SerializeObject(param.Value)));
            }
            var ex = new Exception(message.ToString(), filterContext.Exception);
            var context = HttpContext.Current;
            ErrorLog.GetDefault(context).Log(new Error(ex, context));
}
于 2013-12-08T18:37:36.913 に答える
1

ここでのAtifの回答に加えて、新しい例外を手動でスローすることにより、ELMAHログに詳細を追加する方法があります。それは特にエレガントではありませんが、それは仕事をしているようです!

男自身からのコメントを聞きたいです...

于 2012-05-29T22:42:02.547 に答える