我想为500、404和403显示一个自定义错误页面。以下是我所做的:

Enabled custom errors in the web.config as follows: <customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors> Registered HandleErrorAttribute as a global action filter in the FilterConfig class as follows: public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); } Created a custom error page for each of the above messages. The default one for 500 was already available out of the box. Declared in each custom error page view that the model for the page is System.Web.Mvc.HandleErrorInfo

对于500,它显示自定义错误页面。对其他人来说,则不然。

我是不是遗漏了什么?

当我阅读HandleErrorAttribute类的OnException方法中的代码时,它看起来并不是显示自定义错误的全部,而且它只处理500个。

我必须做什么来处理其他错误?


当前回答

看来我来晚了,但你最好也看看这个。

在系统中。web用于缓存应用程序中的异常,例如返回HttpNotFound()

  <system.web>
    <customErrors mode="RemoteOnly">
      <error statusCode="404" redirect="/page-not-found" />
      <error statusCode="500" redirect="/internal-server-error" />
    </customErrors>
  </system.web>

在系统中。webServer用于捕获IIS捕获的错误,而这些错误没有进入asp.net框架

 <system.webServer>
    <httpErrors errorMode="DetailedLocalOnly">
      <remove statusCode="404"/>
      <error statusCode="404" path="/page-not-found" responseMode="Redirect"/>
      <remove statusCode="500"/>
      <error statusCode="500" path="/internal-server-error" responseMode="Redirect"/>
  </system.webServer>

在最后一个例子中,如果你担心客户端响应,那么将responseMode="Redirect"更改为responseMode="File"并提供一个静态html文件,因为这个例子将显示一个响应代码为200的友好页面。

其他回答

我做过pablo解决方案,我总是有错误(MVC4)

未找到视图'Error'或其主视图或没有视图引擎支持搜索位置。

要去掉这个,去掉线条

 filters.Add(new HandleErrorAttribute());

在FilterConfig.cs

我建议使用Global.asax.cs文件。

 protected void Application_Error(Object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    if (exception is HttpUnhandledException)
    {
        Server.Transfer("~/Error.aspx");
    }
    if (exception != null)
    {
        Server.Transfer("~/Error.aspx");
    }
    try
    {
        // This is to stop a problem where we were seeing "gibberish" in the
        // chrome and firefox browsers
        HttpApplication app = sender as HttpApplication;
        app.Response.Filter = null;
    }
    catch
    {
    }
}

你可以得到正确工作的错误,而不入侵global.cs,扰乱HandleErrorAttribute,做响应。TrySkipIisCustomErrors,连接Application_Error,或者别的什么:

在系统。Web(只是平常的,开/关)

<customErrors mode="On">
  <error redirect="/error/401" statusCode="401" />
  <error redirect="/error/500" statusCode="500" />
</customErrors>

在system.webServer中

<httpErrors existingResponse="PassThrough" />

现在事情的表现应该和预期的一样了,您可以使用ErrorController来显示您需要的任何东西。

我已经设置好了一切,但仍然无法在登台服务器上看到状态代码500的正确错误页面,尽管在本地开发服务器上一切正常。

我发现Rick Strahl的这篇博文对我很有帮助。

我需要添加响应。TrySkipIisCustomErrors = true;到我的自定义错误处理代码。

看来我来晚了,但你最好也看看这个。

在系统中。web用于缓存应用程序中的异常,例如返回HttpNotFound()

  <system.web>
    <customErrors mode="RemoteOnly">
      <error statusCode="404" redirect="/page-not-found" />
      <error statusCode="500" redirect="/internal-server-error" />
    </customErrors>
  </system.web>

在系统中。webServer用于捕获IIS捕获的错误,而这些错误没有进入asp.net框架

 <system.webServer>
    <httpErrors errorMode="DetailedLocalOnly">
      <remove statusCode="404"/>
      <error statusCode="404" path="/page-not-found" responseMode="Redirect"/>
      <remove statusCode="500"/>
      <error statusCode="500" path="/internal-server-error" responseMode="Redirect"/>
  </system.webServer>

在最后一个例子中,如果你担心客户端响应,那么将responseMode="Redirect"更改为responseMode="File"并提供一个静态html文件,因为这个例子将显示一个响应代码为200的友好页面。