Необработанные исключения метода страницы ведут себя как другие необработанные исключения 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 не имеет этой проблемы.

Другие вопросы по тегам