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

时间:2016-10-03 01:27:15

标签: asp.net asp.net-mvc http-status-code-404 custom-error-pages

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

我添加了一个Error控制器,其中包含IndexPageNotFound个动作。我还将以下内容添加到 web.config 文件的<system.web>部分。

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

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

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

  1. 在上面的情况中,似乎返回到浏览器的结果代码是200而不是404.因此Google等抓取工具无法指示找不到该网址。
  2. 在某些情况下,如果我的控制器操作确定网址无效,则操作将返回HttpNotFound()作为结果。但是当发生这种情况时,我的自定义错误处理程序页面显示。相反,它显示了一个似乎来自IIS的通用404页面。
  3. 我正在使用当前版本的Visual Studio和MVC。

1 个答案:

答案 0 :(得分:2)

除了在 web.config 中进行设置外,您还需要检查 Application_Error 中的Exception是否为 HttpException 404

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

CommonController

您还希望在 PageNotFound 操作方法中返回Response.StatusCode = 404;

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