Asp.net mvc 4 从ASP.NET MVC 4返回的不同404页

Asp.net mvc 4 从ASP.NET MVC 4返回的不同404页,asp.net-mvc-4,Asp.net Mvc 4,我有一个简单的ASP.NETMVC4互联网应用程序。当我转到/NotFound时,我会看到他的错误页面: 而如果我去/家/关于/某事/不存在,我会 有人能告诉我引擎盖下发生了什么吗 我在System.Web.Mvc中查看了DefaultControllerFactory类的GetControllerInstance,我可以看到: throw new HttpException(404, String.Format( CultureInfo.CurrentCulture, Mv

我有一个简单的ASP.NETMVC4互联网应用程序。当我转到/NotFound时,我会看到他的错误页面:

而如果我去/家/关于/某事/不存在,我会

有人能告诉我引擎盖下发生了什么吗

我在System.Web.Mvc中查看了DefaultControllerFactory类的GetControllerInstance,我可以看到:

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

但我不知道在哪里处理这个异常。我在正确的轨道上吗?

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

假设您使用的是默认路由,那么异常确实是由
GetControllerInstance
引发的,因为没有
NotFoundController

改为转到“/Home/NotFound”将从
Controller.HandleUnknownAction
引发类似的异常(也是404
HttpException
),因为“NotFound”现在用作操作名称

在第二种情况下,URL与任何路由都不匹配,因此MVC不会处理它-相反,IIS会尝试自己处理它,并显示自己的404页面,因为它在URL指示的路径上也找不到任何其他处理程序或实际文件

至于如何处理所有这些案件,我们应该有所帮助

处理从
GetControllerInstance
引发的异常的简短版本是“它不是-在您可以控制的任何地方”。您可以使用global.asax中的global
Application\u Error
方法,也可以使用链接问题中的许多其他方法之一(例如,将控制器工厂替换为覆盖了
GetControllerInstance
的工厂,以添加更接近问题发生位置的异常处理)