在大多数情况下,我会自动调用404错误的自定义错误页面。但是,某些网址会跳过我的自定义错误页面并调用iis 404错误页面。为什么会这样?
这是在IIS 7.5上运行的MVC 4项目
//This invokes my Custom 404 error page.
http://192.168.1.10/test1/test2/test3
//This bypasses my Custom 404 and invokes the iis 404 error page.
http://192.168.1.10/test1/test2/test3/test4
//Web.config
<system.web>
<customErrors mode="On" defaultRedirect="Error">
<error statusCode="404" redirect="Error404" />
</customErrors>
...
//Route
routes.MapRoute(
name: "Error404",
url: "error404",
defaults: new { controller = "Error", action = "Error404" }
);
//Error Controller
public ActionResult Error404()
{
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
return View();
}
答案 0 :(得分:3)
我不确定为什么你的自定义错误有时会绕过,但让我告诉你我在MVC4网站上做了什么。
1,我在RouteConfig.cs的RouteCollection
中创建了一个包罗万象的路线:
routes.MapRoute(
name: "CatchAll",
url: "{*catchall}",
defaults: new { controller = "Error", action = "Index", statusCode = 404, error = new HttpException(404, "Route not found via RouteConfig.") });
第二,我创建了一个名为Controller
的{{1}}。它的唯一工作就是处理网站中抛出的异常:
Error
我正在使用ErrorViewModel来显示HTML源代码中的详细错误。
第3,在public class ErrorController : Controller
{
public ActionResult Index(int statusCode, Exception error)
{
ErrorViewModel vm = new ErrorViewModel();
vm.CurrentException = error;
vm.InnerException = error.InnerException ?? null;
vm.StatusCode = statusCode;
Response.StatusCode = statusCode;
Response.TrySkipIisCustomErrors = true;
return View(vm);
}
}
中,我覆盖了Global.asax
方法以捕获网站中的每个例外情况,并通过步骤1中制作的Application_Error
控制器处理它们:
Error
就是这样,我从web.config中删除了CustomErrors节点。 这个答案的大部分内容都在blog post上找到。
Response.TrySkipIisCustomErrors = true;
是覆盖IIS 404页面的关键。
希望它有所帮助!
答案 1 :(得分:2)
所以我自己就完成了这个练习,这就是我的所作所为。
您的(我们的)应用程序由于一个非常特殊的原因而失败:传入的请求与任何路由(包括“默认”路由)不匹配,并且因错误而落入IIS 。您需要做的是在“默认”路由下面的RouteConfig.cs(对于MVC4)的最底部添加以下路由:
routes.MapRoute(
name: "Catchall",
url: "{*url}",
defaults: new { controller = "Error", action = "404" }
);
这样做可以防止执行错误地返回IIS并允许您的应用程序最后一次机会弹出您的404.
示例网址:http://yoursite.com/some/fake/route将按预期命中您的默认路由并输出404(假设您没有某个控制器具有接受参数Route的Fake操作)。
一旦你再添加一个url段,例如http://yoursite.com/some/fake/route/die,你需要catch all来处理它。
路径定义中的*允许您捕获尽可能多的URL段,而不必为每种可能的情况添加一个(这也是不可能的)。请记住,这是一个通用案例解决方案......您可能有其他路由(具有超过3个url段)并且可能需要稍微调整它(例如,RouteConfig.cs中的那些路由声明需要更高)而不是收获)。
答案 2 :(得分:0)
这是项目来源,可能会对您有所帮助https://github.com/13daysaweek/Mvc4CustomErrorPage