404错误气泡通过MVC错误控制器

时间:2014-09-25 16:35:46

标签: asp.net-mvc error-handling http-status-code-404 asp.net-mvc-routing

我试图稍微修复我对MVC的错误处理,并从这里实现了Marco的解决方案:
ASP.NET MVC 404 Error Handling

这在我的Win7工作站上完美运行。但由于某种原因,它无法在服务器上运行。 某些错误可以正常工作,但是例如,如果我调用一个不存在的控制器和路由,我会得到标准的IIS 404页面。

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

这是我的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文件,但找不到区别。

1 个答案:

答案 0 :(得分:2)

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

所以你的Application_EndRequest可能如下所示:

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