我试图稍微修复我对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文件,但找不到区别。
答案 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));
}
}