Как отловить ошибки AJAX WebMethod в global.asax?

Я использую обычную практику обнаружения ошибок в global.asax в моем приложении ASP.net. В global.asax у меня есть функция Application_Error, которая записывает ошибки в базу данных.

Это очень хорошо работает для регистрации ошибок, возникающих, когда пользователь запрашивает страницу.

Однако это не помогает, когда асинхронный метод (метод, украшенный атрибутом [WebMethod]), вызываемый со стороны клиента, вызывает исключение. Исключение просто всплывает и может быть возвращено в код на стороне клиента, но я хотел бы, чтобы код обработки ошибок запускался на сервере автоматически, подобно тому, как ошибки страницы регистрируются в global.asax.

Как мне этого добиться? Один из способов - обернуть каждый асинхронный метод с помощью try-catch, но мне это не кажется хорошим решением.


person Vivian River    schedule 29.06.2011    source источник


Ответы (2)


Один из вариантов - создать ASP.NET выходной фильтр, который перехватывает и регистрирует исключения WebMethod, отправляемые ASP.NET клиенту. Вот основная идея:

  1. Создайте подкласс Stream, который фиксирует содержимое ответа.
  2. Когда поток закрывается, проверьте, имеет ли ответ код состояния 500, а также заголовок "jsonerror: true". Если это так, ответ содержит исключение WebMethod; зарегистрируйте исключение.
  3. В Global.Application_PostMapRequestHandler установите экземпляр этого класса в качестве выходного фильтра для запросов JSON.

Полный исходный код см. В этом ответе StackOverflow.

person Michael Liu    schedule 18.06.2018

Как создать глобальный обработчик исключений для веб-службы

person Akhil    schedule 29.06.2011
comment
Этот подход не подходит для вызова WebMethods через AJAX GET / POST, только для вызовов веб-службы SOAP. - person Carson63000; 05.06.2014