Asp.net mvc 404错误气泡通过MVC错误控制器

Asp.net mvc 404错误气泡通过MVC错误控制器,asp.net-mvc,error-handling,http-status-code-404,asp.net-mvc-routing,Asp.net Mvc,Error Handling,Http Status Code 404,Asp.net Mvc Routing,我已经尝试修复了一点MVC的错误处理,并从这里实现了Marco的解决方案: 这在我的Win7工作站上非常有效。但由于某些原因,它在服务器上不起作用。 某些错误可以正常工作,但例如,如果我调用一个不存在的控制器和路由,我会得到标准的IIS404页面 我已经输入了一些日志,并调用和执行了Error404Controller,但由于某些原因,处理没有停止,随后它会加载IIS 404错误页面 这是my global.asax中的代码 protected void Application_EndRequ

我已经尝试修复了一点MVC的错误处理,并从这里实现了Marco的解决方案:

这在我的Win7工作站上非常有效。但由于某些原因,它在服务器上不起作用。 某些错误可以正常工作,但例如,如果我调用一个不存在的控制器和路由,我会得到标准的IIS404页面

我已经输入了一些日志,并调用和执行了Error404Controller,但由于某些原因,处理没有停止,随后它会加载IIS 404错误页面

这是my global.asax中的代码

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 404)
    {
        Response.Clear();

        var rd = new RouteData();
        rd.Values["controller"] = "Error404";
        rd.Values["action"] = "Index";

        IController c = new SuperMvc.Controllers.Error404Controller();
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
    }
}
这是控制器:

[AcceptVerbs(HttpVerbs.Get)]
public virtual ActionResult Index()
{
    log.Error("Error404Controller.Index");

    PageError error = new PageError();

    error.Url = Request.Url.AbsoluteUri;
    log.Error("Request.Url=" + error.Url);

    error.UrlReferrer = Request.UrlReferrer.AbsoluteUri;
    log.Error("Request.UrlReferrer=" + error.Url);

    return View(error);
}

有什么想法吗?我检查了web.config文件,没有发现差异。

如果在IIS7中,您需要使用
Response.tryskipiiscustomerors=true告诉IIS7忽略自定义错误页。这将根据禁用该响应的IIS自定义错误页

因此,您的应用程序请求可能如下所示:

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 404)
    {
        Response.Clear();

        var rd = new RouteData();
        rd.Values["controller"] = "Error404";
        rd.Values["action"] = "Index";

        Response.TrySkipIisCustomErrors = true;
        IController c = new SuperMvc.Controllers.Error404Controller();
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd));
    }
}

当您尝试不存在的控制器/操作时,是否记录了状态代码?当它到达这一点时,它肯定是404吗?(我想有时候我会得到blah没有实现IController-这将是一个代码500)不,我确实在应用程序中得到404响应代码,并且会调用Error404Controller,但我仍然会得到IIS 404错误页面,而不是我的。干杯!您必须将其添加到web.config中,然后它才能正常工作。