$.ajax()
调用调用带有[WebMethod]
属性的页面代码后端中的静态方法来执行AJAX请求。如果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}
我使用 Fiddler 进行测试,尝试编辑载荷到不完整的 JSON。
{"stringParam":"oh hai","intPara
我收到了以下来自 JavaScriptObjectDeserializer
的ArgumentException
错误响应,它被发送给客户端(这是在没有自定义错误的情况下在本地运行的简单测试应用程序):
{"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
事件,也从未进入我们的代码,因此我们无法自己记录错误。
我找到了一个类似的问题,其中提到了博客文章 "如何为Web服务创建全局异常处理程序",但这似乎只适用于SOAP Web服务,而不是AJAX GET / POST。
在我的情况下是否有类似的方法可以附加自定义处理程序?
responseJson
变量进行读取),并且没有钩子来访问实际的异常对象。 - Michael Liu