5

正常工作,我有我的Global.asax底部以下路线:MVC:404路线不是在生产中

//404 ERRORS: 
routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "Error", action = "PageNotFound" } 
); 

其中一期工程在Visual Studio罚款,但在生产中我得到了IIS错误页。

不应该这条路线赶上任何 URL没有被别人抓住,因此从IIS的角度来看没有404s?还有什么我需要做的web.config?

注意:我做不是想要重定向到404特定的URL;而是我在请求的URL上提供了404错误页面(我相信这是从可用性角度来看的正确方法)。

UPDATE
在我的差错控制,我设置Response.StatusCode = 404;,这似乎是这个问题。当我删除这个并再次部署到生产环境时,我又收到了友好的错误页面。不过,我相信我做需要在HTTP头中的404个状态 - 搜索引擎优化的目的 - 所以我现在的问题就变成了:

经修订的课题
如何/为什么IIS拦截响应并发送其开箱即用的404错误,以及如何防止这种情况?

** SOLUTION * *
Dommer得到奖建议Response.TrySkipIisCustomErrors=true;这(我认为)是必要的。但也有2个其他关键细节:

  • 自定义错误必须在在web.config中(废话!),并
  • 404行动必须有[HandleErrors]属性。

使其成为无处不在的工作
由于某些URL可能会映射到除了“404-PageNotFound”等,但包含无效参数的路线,因为我不想重定向到 404页,我在基地控制器创造了这个动作:

[HandleError] 
public ActionResult NotFound() 
{ 
    Response.StatusCode = 404; 
    Response.TrySkipIisCustomErrors = true;  
    return View("PageNotFound", SearchUtilities.GetPageNotFoundModel(HttpContext.Request.RawUrl));   
} 

和任何控制器的行动,在继承的基础上,我只需要调用这个每当我赶上了无效的路径参数:

return NotFound(); 

注: RedirectToAction()在蛋糕上

结冰:
我已经生成并传递到视图的模型是对URL的罗嗦位送入我们的搜索引擎,并在友好的404页面上显示前3名的结果作为建议。

+0

你得到了这个工作很高兴。它看起来不错! –

回答

4

问题是您的请求与您之前的某条路线相匹配,然后失败。一种可能的解决办法是尽量限制对方的路线是这样的:

// This will match too many things, so let's constrain it to those we know are valid 
    routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    new { controller = "Home|OtherController|AnotherController|..." } // regular expression matching all valid controllers 
); 

//404 ERRORS: 
routes.MapRoute(
    "404-PageNotFound", 
    "{*url}", 
    new { controller = "Error", action = "PageNotFound" } 
); 

如果你想有一个更全面的答案,然后看看这个:How can I properly handle 404 in ASP.NET MVC?

编辑:

为了摆脱的自定义IIS错误尝试更改您的错误控制器是这样的:

Response.StatusCode = 404; 
Response.TrySkipIisCustomErrors=true; // add this line 

MSDN文档:http://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

+0

原来这不是路线匹配问题。相反,我怀疑,这是一个IIS7设置问题。请参阅我的问题更新。 – Faust

+0

我已经添加了一些应该帮助的内容。 –

+0

请注意,您拼写错误TrySkipIisCustomErrors中间有一个额外的“我”。 – Faust

0

请尝试这样

routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "account", action = "index", id = UrlParameter.Optional } // Parameter defaults 
      ); 


routes.MapRoute(
         "404-PageNotFound", // Route name 
         "{*url}", 
         new { controller = "Error", action = "PageNotFound", id = UrlParameter.Optional } // Parameter defaults 
        ); 
+0

@Prassanth:404路由的目的是捕获所有意外的请求,因此通配符{* url}路由模式非常必要 - {controller}/{action}不会这样做。顺便说一句:我发现了更多关于我的问题的信息,并修改了这个问题。 – Faust

+0

我编辑了代码 – Prasanth

+0

我认为IIS中的DNS设置重定向是必需的。尝试按照要求设置DNS进行重定向 – Prasanth