好的,所以我对这个问题很难过。我已经看到了许多应该解决这个问题的事情,但我没有得到满足我要求的解决方案。
我正在使用ELMAH来记录异常,并且当具有无效控制器或适当控制器的URL和无效操作时,我会收到此异常。
System.Web.HttpException: The controller for path '/BadController' was not found or does not implement IController.
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.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
我想阻止这个异常被抛出。我正在使用自定义错误,它们工作正常,因为应用程序将发送到我的自定义404错误页面。但是,异常仍会被记录。
我有[HandleError]
属性装饰所有控制器。这可能吗?如果是这样,我会感激任何帮助。
我已经尝试过设置final route that redirects,但无论出于何种原因,它都匹配之前的路线。我尝试使用httpModule,并在Application_Error
文件的Global.asax
事件中清除。没有什么能阻止这种例外。
再次感谢您的帮助!
答案 0 :(得分:4)
创建一个RouteConstraint,检查控制器是否存在(事实上,在开始时扫描所有可能的控制器并缓存它,你知道我的意思) 并将其添加到您的标准路线。
因此,当您向坏控制器发出请求时,正常路由不会接受该请求。 但随后接受了捕获 - > 404路线......
答案 1 :(得分:2)
连接自定义控制器工厂,当它找不到所请求的控制器时,可以执行所需的功能。这只是几行代码,没什么太痛苦的。
您可以滚动自己的控制器工厂,或使用众多库中的一个作为起点。你将有一个实现IControllerFactory的类,在CreateController()函数中将是你的自定义逻辑。
答案 2 :(得分:1)
可能没有正确地转发我的问题,因为应该抛出大量的这个异常。答案是从ELMAH中排除这些例外,根据article。
默认情况下,ELMAH会记录详细信息 每个未处理的例外,包括 404和其他HTTP错误。您可以 指示ELMAH忽略这些或 使用错误的其他类型的错误 过滤
答案 3 :(得分:0)
我使用DSO's ITCloud Contrib。这些{controller}/{action}
通用参数都不是。每个操作方法的显式UrlRoute
属性。我喜欢直接在方法上方看到参数约束。