我有一个简单的ASP.NET MVC 4 Internet应用程序。当我去/ NotFound时,我得到他的错误页面:
如果我去/ Home / About / something / nothingxistent,我得到
谁能告诉我幕后发生了什么?
我已经进入System.Web.Mvc中DefaultControllerFactory类的GetControllerInstance,我可以看到:
throw new HttpException(404,
String.Format(
CultureInfo.CurrentCulture,
MvcResources.DefaultControllerFactory_NoControllerFound,
requestContext.HttpContext.Request.Path));
但我无法弄清楚该异常的处理方式。我在正确的轨道吗?
答案 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
的方法以添加例外处理更接近问题的地方)。