[英]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.