IIS7集成管道模式下的异常处理

发布于 2024-07-26 23:38:40 字数 726 浏览 9 评论 0原文

我有一个托管在 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 集成模式下运行的自定义错误页面中,如何获取对已处理异常的引用?

I have an application hosted on IIS7 running in Integrated mode. I'm handling errors by putting the following into Web.config:

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

(Because this is Integrated mode the <customErrors> block is not used.)

I want to automatically send emails every time an exception is generated. But the problem is that within Error.aspx I can't figure out how to get a reference to the exception. I tried this:

Dim oEx As Exception = Server.GetLastError()

But it returns Nothing. I also tried HttpContext.Current.Error() and HttpContext.Current.AllErrors and those don't work either.

In a custom error page running under IIS7 Integrated mode, how do I get a reference to the handled exception?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

触ぅ动初心 2024-08-02 23:38:40

您需要在 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();
}

You need to intercept the error, either in Global.asax or a custom IHttpModule implementation as follows:

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");
    }
}

Then, in 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();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文