从ASP.NET MVC 4返回不同的404页面

时间:2013-09-18 15:45:53

标签: asp.net-mvc-4

我有一个简单的ASP.NET MVC 4 Internet应用程序。当我去/ NotFound时,我得到他的错误页面:

enter image description here

如果我去/ Home / About / something / nothingxistent,我得到

enter image description here

谁能告诉我幕后发生了什么?

我已经进入System.Web.Mvc中DefaultControllerFactory类的GetControllerInstance,我可以看到:

throw new HttpException(404,
String.Format(
    CultureInfo.CurrentCulture,
    MvcResources.DefaultControllerFactory_NoControllerFound,
    requestContext.HttpContext.Request.Path));

但我无法弄清楚该异常的处理方式。我在正确的轨道吗?

1 个答案:

答案 0 :(得分:0)

第一种情况 .NET 错误页面 - 因为您的/ NotFound网址已被您的路由覆盖,但找不到控制器。换句话说,MVC处理请求,因为它具有匹配它的路由(例如"{controller}/{action}/{id}",其中所有三个参数都是可选的或具有默认值),但随后发现它在其头部。

假设您正在使用默认路由,GetControllerInstance确实引发了异常 - 因为没有NotFoundController

转而使用“/ Home / NotFound”会从HttpException引发类似的异常(也是404 Controller.HandleUnknownAction),因为“NotFound”现在被用作动作名称。

第二种情况中,网址与任何路由都不匹配,因此MVC无法处理它 - 而是 IIS 尝试自行处理它,并显示其拥有 404页面,因为它在URL指示的路径中也找不到任何其他处理程序或实际文件。

至于如何处理所有这些案件,this stackoverflow question应该有所帮助。

处理从GetControllerInstance抛出的异常的简短版本是“它不是 - 在任何你可以控制的地方”。您可以在global.asax中使用全局Application_Error方法,也可以使用链接问题中的许多其他方法之一(例如,将控制器工厂替换为已覆盖GetControllerInstance的方法以添加例外处理更接近问题的地方)。