我們有一個較舊的ASP.NET WebForms應用程序,它通過在客戶端使用jQuery $.ajax()
調用來執行AJAX請求,並在用[WebMethod]
屬性裝飾的頁面代碼隱藏中調用靜態方法。從調用ASP.NET WebMethod格式錯誤的Json中捕獲錯誤
如果在WebMethod中發生未處理的異常,它不會觸發Application_Error
事件,因此我們的錯誤記錄器(ELMAH)不會拾取它。這是衆所周知的,而不是一個問題 - 我們將所有WebMethod代碼包裝在try-catch塊中,並將異常情況手動記錄到ELMAH。
但是,有一個案例讓我難住。如果格式不正確的Json發佈到WebMethod URL,它會在輸入我們的代碼之前拋出異常,並且我找不到任何方法來捕獲它。
例如此的WebMethod簽名
[WebMethod]
public static string LeWebMethod(string stringParam, int intParam)
通常調用一個JSON有效載荷,如:
{"stringParam":"oh hai","intParam":37}
我使用招編輯有效載荷到畸形的JSON嘗試了測試:
{"stringParam":"oh hai","intPara
,並得到了以下ArgumentException
從JavaScriptObjectDeserializer
發送給客戶端的錯誤響應(這是在一個簡單的測試應用程序本地運行,沒有自定義錯誤):
{"Message":"Unterminated string passed in. (32): {\"stringParam\":\"oh hai\",\"intPara","StackTrace":" at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeString()\r\n at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeMemberName()\r\n at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n at
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n at
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n at
System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n at
System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at
System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
它仍然沒有發射的Application_Error
事件,並不會進入我們的代碼,所以我們無法登錄的錯誤自己。
我發現了一個類似的問題,它有一個指向博客文章「How to create a global exception handler for a Web Service」的指針,但似乎只對SOAP web服務有效,而不是AJAX GET/POST。
有沒有類似的方式來附加自定義處理程序在我的情況?
這看起來像一個非常有前途的想法,我一定會嘗試沿着這些路線的實驗! – Carson63000
邁克爾,這個建議絕對完美,它是一顆寶石!我非常抱歉,你的回答遲到了,我要把它獎給原來的賞金,我已經創造了一個新獎給你。顯然,我必須等待24小時才能獲得獎勵。 – Carson63000
@ Carson63000:我很高興我的代碼適合你。慷慨獎勵新的獎勵,但考慮到它的大小,我會等待看看其他人能否提供更好的答案。 –