Необработанные исключения метода страницы ведут себя как другие необработанные исключения ASP.Net
У меня есть веб-форма, которая имеет метод одной страницы. Мои другие веб-приложения регистрируют необработанные исключения в журнале системных событий на веб-сервере. Поскольку другие разработчики, с которыми я работаю, ожидают увидеть записи об ошибках приложения в журнале событий, я бы хотел, чтобы это приложение делало то же самое.
Тем не менее у меня есть приложение отправлять сообщения об ошибках, когда исключение происходит от вызова кода внутри метода страницы. Когда это происходит, он не записывает в журнал событий. Примечание. Метод page повторно вызывает исключение после вызова метода уведомления по электронной почте.
Из того, что я прочитал до сих пор, кажется, что ASP.Net регистрирует ошибки в журнале событий по умолчанию. Я полагаю, что то же самое не относится к методам Page Methods/WebMethods, потому что они в основном генерируют исключение для кода клиента, вызывающего его.
Есть ли тривиальный способ, чтобы это исключение правильно всплыло, чтобы оно записывалось в журнал событий? Никакие другие приложения не пишут в журнал событий непосредственно из того, что я видел, поэтому я не думаю, что приложение могло бы создать новый источник, так как наши сотрудники по безопасности держат много вещей заблокированными (с благими намерениями, да, безопасность).
[WebMethod]
public static object MyPseudoWebMethod()
{
try
{
// My exception spawning unreliable code here
}
catch(Exception ex)
{
// Cleanup ...
this.SendErrorNotification(ex);
throw; // <-- This doesn't bubble up but I'd love for it to!
}
}
2 ответа
Хм интересная проблема. Вы правы в том, что исключения WebMethod НЕ следуют обычному потоку исключений.
Событие Application_Error не вызывается, если ваш веб-метод вызывает исключение. Причина этого заключается в том, что обработчик HTTP для веб-служб XML использует любое исключение, которое возникает во время выполнения веб-службы XML, и превращает его в ошибку SOAP до вызова события Application_Error.
( отсюда)
На приведенной выше странице предлагается использовать расширение SOAP для перехвата этого исключения перед его проглатыванием, но вот как бы я это сделал, если вы не хотите этого делать:
1) Создайте новую ASPX-страницу "Получение ошибок", которая будет принимать все параметры, которые вы хотите записать в журнал ошибок. Так, например, пусть эта страница принимает POST с именем "ExceptionDetails" или что-то еще, что вы хотите захватить. Эта страница НЕ будет просматриваться непосредственно в браузере, поэтому она не требует каких-либо элементов управления ASPX или чего-либо еще, но использование на ней MasterPage ничего не повредит.
2) В коде этой новой страницы возьмите все отправляемые ПОСТЫ и добавьте исключение с любой необходимой информацией. Немедленно брось это исключение. Это означает, что это исключение будет следовать тому же потоку, что и другие необработанные исключения в приложении (ведение журнала, отправка по электронной почте и т. Д.).
3) На странице, которая вызывает WebMethod JS, оберните вызовы WebMethod в try-catch
4) В блоке catch распечатайте любое сообщение, которое вы хотите в браузере, и инициируйте новую запись AJAX на эту новую страницу с ошибкой при получении ASPX-страницы, передавая все материалы POST, которые вы заставили эту страницу искать.
Новый AJAX-вызов НЕ изменит НИЧЕГО в восприятии пользователя по умолчанию. Вызов AJAX запускает новый запрос к этой странице, и сама страница ASPX фактически не знает, что это AJAX, а не обычный запрос браузера. Любые файлы cookie / сеанс / данные аутентификации, которые установлены в данный момент, также доступны на странице AJAXed, если вы записываете идентификатор пользователя или что-то еще. Если вы посмотрите на возвращенный ответ от такого инструмента, как Firebug, то увидите, что это фактически HTML-код YellowScreenOfDeath (если только у вас нет пользовательской страницы 500, в этом случае это тот HTML, который возвращается).
Это просто, как работают устаревшие веб-сервисы ASMX.
Единственный обходной путь - прекратить их использование (что вы должны делать в любом случае, если вы не застряли с.NET 2.0). WCF не имеет этой проблемы.