У нас есть более раннее приложение ASP.NET WebForms, которое выполняет запрос AJAX, используя вызовы jQuery $.ajax()
на стороне клиента, вызывая статические методы в коде кода, украшенными атрибутами [WebMethod]
.
Если в WebMethod возникает необработанное исключение, оно не запускает событие Application_Error
и поэтому не подхвачено нашим регистратором ошибок (ELMAH), Это хорошо известно, а не проблема. У нас есть весь код WebMethod, заключенный в блоки try-catch с исключениями, которые вручную регистрируются в ELMAH.
Однако есть один случай, который меня озадачил. Если некорректный Json отправлен на URL WebMethod, он выдает исключение перед входом в наш код, и я не могу найти способ его захватить.
например. эта подпись WebMethod
[WebMethod]
public static string LeWebMethod(string stringParam, int intParam)
Обычно вызывается с полезной нагрузкой Json, например:
{"stringParam":"oh hai","intParam":37}
Я попробовал тест с помощью Fiddler для редактирования полезной нагрузки для искаженного 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
, и он никогда не входит в наш код, поэтому мы не можем самостоятельно регистрировать ошибку.
Я нашел аналогичный вопрос, который получил указатель на сообщение в блоге " "Как создать глобальный обработчик исключений для веб-службы" , но это кажется действительным только для веб-сервисов SOAP, а не AJAX GET/POST.
Есть ли аналогичный способ привязки пользовательского обработчика в моей ситуации?