3

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

在此处输入图像描述

而如果我去 /Home/About/something/nonexistent,我得到

在此处输入图像描述

谁能告诉我引擎盖下发生了什么?

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

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

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

4

1 回答 1

0

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

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

相反,转到 "/Home/NotFound" 会引发类似的异常(也是 404 HttpExceptionController.HandleUnknownAction,因为现在使用 "NotFound" 作为操作名称。

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

至于如何处理所有这些情况,这个 stackoverflow 问题应该会有所帮助。

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

于 2013-09-18T15:58:53.063 回答