ASP.NET MVC 自定义错误页面无法正常工作

ASP.NET MVC custom error page not working correctly

我正在尝试配置 ASP.NET MVC 自定义错误页面。

我添加了一个带有 IndexPageNotFound 操作的 Error 控制器。我还将以下内容添加到 web.config 文件的 <system.web> 部分。

<customErrors mode="On" defaultRedirect="~/Error">
  <error statusCode="404" redirect="~/Error/PageNotFound"/>
  <error statusCode="500" redirect="~/Error" />
</customErrors>

如果我输入 URL,例如 http://www.example.com/Home/BadPage,我确实看到了我的错误处理程序。

但是,任何人都可以帮助我了解以下问题以及如何解决这些问题吗?

  1. 在上面的例子中,似乎 return 发送到浏览器的结果代码是 200 而不是 404。因此 Google 等爬虫不会指示 URL 未找到。
  2. 在某些情况下,如果我的控制器操作确定 URL 无效,则操作将 return HttpNotFound() 作为结果。但是当发生这种情况时,我的自定义错误处理程序页面 不会 显示。相反,它显示一个看似来自 IIS 的通用 404 页面。

我使用的是 Visual Studio 和 MVC 的当前版本。

除了在web.config里面设置,还要检查里面的Exception是不是HttpException 404 =]Application_Error.

<customErrors defaultRedirect="~/Common/Error" mode="On">
  <error statusCode="404" redirect="~/Common/PageNotFound"/>
</customErrors>

Global.asax.cs

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();

    // Process 404 HTTP errors
    var httpException = exception as HttpException;
    if (httpException != null && httpException.GetHttpCode() == 404)
    {
        Response.Clear();
        Server.ClearError();
        Response.TrySkipIisCustomErrors = true;

        IController controller = new CommonController();

        var routeData = new RouteData();
        routeData.Values.Add("controller", "Common");
        routeData.Values.Add("action", "PageNotFound");

        var requestContext = new RequestContext(
             new HttpContextWrapper(Context), routeData);
        controller.Execute(requestContext);
    }
}

通用控制器

您还想 return Response.StatusCode = 404; 里面的 PageNotFound 操作方法。

public class CommonController : Controller
{
    [AllowAnonymous]
    public ActionResult PageNotFound()
    {
        Response.StatusCode = 404;
        Response.TrySkipIisCustomErrors = true;

        return View();
    }

    [AllowAnonymous]
    public ActionResult Error()
    {
        Response.StatusCode = 503;
        Response.TrySkipIisCustomErrors = true;

        return View();
    } 
}