“没有找到路径'...'的控制器,或者没有实现IController。”触发500而不是404

时间:2014-09-02 15:15:50

标签: asp.net-mvc error-handling asp.net-mvc-routing

如果找不到路由,则此MVC应用程序将抛出HttpException。这没关系,例外有404状态代码。但是,当设置customErrors时,出于某种原因,而不是跟随404错误,MVC将此异常视为一般未处理的异常,而是遵循500状态代码。

为什么自定义错误会触发500处理,而不是所需的404?

.NET错误页面配置:

enter image description here

堆栈追踪:

at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) 
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) 
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

1 个答案:

答案 0 :(得分:0)

如果您的错误页面本身就会产生错误,那么IIS必须将其放弃并返回500.从屏幕截图中很难确定,但看起来好像是您的错误网页会重定向到没有扩展名的网址,即Http400而不是Http400.html。如果没有扩展名,那么MVC仍将尝试提供URL而不是IIS直接提供静态页面,如果MVC找不到控制器来提供该URL,则会抛出404,这会导致它试图再次提供404网址,它不能,所以它会抛出404,等等。最终,它会因为你有无限的重定向而死于500。

您可以拥有动态错误页面,但您必须非常小心,并确保它们始终正常运行。否则,安全投注始终在静态HTML文件上。如果您已经在做了什么,那么您只需要确保使用扩展程序重定向到实际文件。