customErrors与自定义模块

Ben*_*enG 8 c# asp.net iis asp.net-mvc httpmodule

我目前有httpErrors设置处理500's: -

<httpErrors errorMode="Custom" existingResponse="Replace">
        ......
        <remove statusCode="500"/>
        <error statusCode="500" path="/server-error" responseMode="ExecuteURL"/>
</httpErrors>
Run Code Online (Sandbox Code Playgroud)

这工作正常,但在iis收到错误的情况下,我仍然得到死亡的黄色屏幕.一个例子是当实体框架无法连接到数据库并且我收到: -

无法打开登录请求的数据库"Test-DB".
登录失败.
用户'sa'登录失败.

我已经设置customErrors好处理这个: -

<customErrors mode="On" defaultRedirect="error.html" redirectMode="ResponseRedirect">
        <error statusCode="500" redirect="error.html" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)

只要没有没有,它modules就能按预期工作preCondition="managedHandler".

我有几个模块处理图像和CSS文件,并在同一个项目中.

<modules runAllManagedModulesForAllRequests="false">
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
        <add name="ImageHandler" type="foo.bar.ProductImageHandlerHttpModule" />
        <add name="CustomCssHandler" type="foo.bar.CustomCssHttpModule" />
        <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" preCondition="integratedMode" />
</modules>
Run Code Online (Sandbox Code Playgroud)

评论这些,我得到了error.html,保持他们,我得到

运行时错误
说明:处理请求时发生异常.此外,执行第一个异常的自定义错误页面时发生另一个异常.请求已终止.

显示项目中的模块在尝试显示时也出错error.html.

有谁知道修复/解决方法?

Ond*_*dar 1

这是一个艰难的情况 - 您的错误来自HttpModule,它针对每个请求运行 - 包括对error.html页面的请求。一种方法是仅通过服务器路由静态文件(例如 error.html),并在 .NET 级别忽略它们;这可能并不总是可行(有时在 .NET 级别处理静态文件很方便)。我能想到的唯一其他方法是在 global.asax 中挂钩错误事件并自己处理它(这将忽略customErrors

就像是:

public class Global : System.Web.HttpApplication
{
    protected void Application_Error(object sender, EventArgs e)
    {
        // is there an error ?
        var error = Server.GetLastError();
        if (error != null)
        {
            // mark the error as - "i'll handle it myself"
            Server.ClearError();
            // load error.html manually & dump it to response
            var content = File.ReadAllText(Server.MapPath("~/error.html"));
            Context.Response.Write(content);
            // set correct error code
            Context.Response.StatusCode = 500;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这可以解决,但你看到一般原则......