Обработка исключений в режиме интегрированного конвейера IIS7

У меня есть приложение, размещенное на IIS7, работающее в интегрированном режиме. Я обрабатываю ошибки, помещая в Web.config следующее:

<httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace" 
            defaultResponseMode="ExecuteURL" defaultPath="/Error.aspx">
  <remove statusCode="500" />
  <error statusCode="500" path="/Error.aspx" responseMode="ExecuteURL" />
</httpErrors>

(Поскольку это интегрированный режим, блок не используется.)

Я хочу автоматически отправлять электронные письма каждый раз, когда генерируется исключение. Но проблема в том, что в Error.aspx я не могу понять, как получить ссылку на исключение. Я попробовал это:

Dim oEx As Exception = Server.GetLastError()

Но это ничего не возвращает. Я также попробовал HttpContext.Current.Error() и HttpContext.Current.AllErrors, и они тоже не работают.

Как получить ссылку на обработанное исключение на пользовательской странице ошибок, работающей в интегрированном режиме IIS7?

1 ответ

Вам необходимо перехватить ошибку, либо в Global.asax, либо в пользовательской реализации IHttpModule следующим образом:

public class UnhandledExceptionHandlerModule : IHttpModule {
    private HttpApplication application;

    public void Init(HttpApplication application)
    {
        this.application = httpApplication;
        this.application.Error += Application_Error;
    }

    public void Dispose()
    {
        application = null;
    }

    protected internal void Application_Error(object sender, EventArgs e)
    {
        application.Transfer("~/Error.aspx");
    }
}

Затем в Error.aspx.cs:

protected void Page_Load(object sender, EventArgs e) {
    Response.StatusCode = 500;

    // Prevent IIS from discarding our response if
    // <system.webServer>/<httpErrors> is configured.
    Response.TrySkipIisCustomErrors = true;

    // Send error in email
    SendEmail(Server.GetLastError());

    // Prevent ASP.NET from redirecting if
    // <system.web>/<customErrors> is configured.
    Server.ClearError();
}
Другие вопросы по тегам