Обработка исключений в режиме интегрированного конвейера 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();
}