簡體   English   中英

Elmah:如何從錯誤報告中獲取JSON HTTP請求正文

[英]Elmah: How to get JSON HTTP request body from error report

我正在使用Elmah記錄異常。 如果請求是基於表單的請求(即Content-Type:application / x-www-form-urlencoded),Elmah非常擅長記錄請求主體,但是基於JSON的請求,其中內容類型是application / 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"}

到目前為止,ELMAH僅記錄請求外圍的上下文或信息,並且可以以標准方式方便地捕獲。 表單可以說是一種特殊的處理方式,因為當MIME類型為application/x-www-form-urlencoded時,ASP.NET已經完成了解碼和記憶請求實體的工作。 另一方面,JSON請求是原始的,因為在發生異常時,輸入流( HttpRequest.InputStream )可能已被JSON解碼器部分或完全消耗。 為了記錄,ELMAH無法獲得第二次破解。 因此,您必須確保在將輸入流或文本傳遞給任何JSON解碼器之前緩沖輸入流或文本,並將其存放在HttpContext.Items之類的某處。 然后,您可以嘗試恢復緩沖的數據,並在發生錯誤時將其附加到外發郵件 ELMAH當前不支持將任意數據附加到記錄的錯誤。 但是, ErrorLogModule有一個Logged事件,它提供了記錄錯誤的Id。 這可以用於將輸入數據存儲在別處(如果您使用后端數據庫作為錯誤日志,可能在另一個表中),但通過ID維護關聯將其與記錄的錯誤聯系起來。

首先安裝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));
}

除了Atif的答案之外,還有一種方法可以通過手動拋出一個新的Exception 來為ELMAH日志添加其他細節 它不是特別優雅,但它似乎做了這個工作!

我有興趣聽到這個男人本人的任何評論......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM