Обработка Application_Error в приложении ASP.NET global.asax

Я хочу отправить письмо администратору при сбое приложения. Поэтому я просто делаю это в global.asax:

void Application_error(object sender, EventArgs e)
{
    SendMessageToAdministarator(Server.GetLastError().ToString());
}

Но на самом деле много раз Application_Error вызывается, даже если приложение не будет сбой.

И я хочу отправить почту администратору ТОЛЬКО, когда приложение разбилось.

Кроме того, есть ли у меня простой способ вернуть приложение?

Я ищу простейшее решение.

Ответ 1

Какие ошибки отправляются, когда приложение не разбивается? Вы можете проверить тип исключения и не отправлять электронные письма в исключениях, которые не приводят к сбою приложения (например, перенаправление может вызывать исключение ThreadAbortException, которое я вручную фильтрую в коде):

protected void Application_Error(Object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    if (ex is ThreadAbortException)
        return;
    Logger.Error(LoggerType.Global, ex, "Exception");
    Response.Redirect("unexpectederror.htm");
}

Вы можете добавить перенаправление на страницу с сообщением для пользователя о том, что произошла ошибка, и некоторые ссылки на соответствующие страницы на сайте. Это для того, чтобы "вернуть приложение обратно" - я надеюсь, что это то, что вы хотели.

Также вы можете посмотреть в журнал с помощью log4net, который также может регистрировать ошибки на сервере и отправлять сообщения об ошибках.