如果找不到路由,则此MVC应用程序将抛出HttpException。这没关系,例外有404状态代码。但是,当设置customErrors时,出于某种原因,而不是跟随404错误,MVC将此异常视为一般未处理的异常,而是遵循500状态代码。
为什么自定义错误会触发500处理,而不是所需的404?
.NET错误页面配置:
堆栈追踪:
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)
答案 0 :(得分:0)
如果您的错误页面本身就会产生错误,那么IIS必须将其放弃并返回500.从屏幕截图中很难确定,但看起来好像是您的错误网页会重定向到没有扩展名的网址,即Http400
而不是Http400.html
。如果没有扩展名,那么MVC仍将尝试提供URL而不是IIS直接提供静态页面,如果MVC找不到控制器来提供该URL,则会抛出404,这会导致它试图再次提供404网址,它不能,所以它会抛出404,等等。最终,它会因为你有无限的重定向而死于500。
您可以拥有动态错误页面,但您必须非常小心,并确保它们始终正常运行。否则,安全投注始终在静态HTML文件上。如果您已经在做了什么,那么您只需要确保使用扩展程序重定向到实际文件。