尝试使用MVC 4自定义错误页面找出一个奇怪的行为。有时我的自定义错误页面会在404上被绕过

时间:2013-01-16 17:33:30

标签: asp.net asp.net-mvc iis asp.net-mvc-4 iis-7.5

在大多数情况下,我会自动调用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();
}

3 个答案:

答案 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)

所以我自己就完成了这个练习,这就是我的所作所为。

  1. 安装了魔法独角兽Mvc错误工具包@ http://nuget.org/packages/MagicalUnicorn.MvcErrorToolkit/(我使用的是nuget)
  2. 按照自述文件@ https://github.com/PureKrome/WorldDomination.Web.Mvc.ErrorHandling
  3. 中的设置说明操作
  4. 您的(我们的)应用程序由于一个非常特殊的原因而失败:传入的请求与任何路由(包括“默认”路由)不匹配,并且因错误而落入IIS 。您需要做的是在“默认”路由下面的RouteConfig.cs(对于MVC4)的最底部添加以下路由:

        routes.MapRoute(
            name: "Catchall",
            url: "{*url}",
            defaults: new { controller = "Error", action = "404" }
        );
    
  5. 这样做可以防止执行错误地返回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