停止为不存在的控制器抛出异常

时间:2010-06-25 23:15:07

标签: .net asp.net-mvc-2 httpexception

好的,所以我对这个问题很难过。我已经看到了许多应该解决这个问题的事情,但我没有得到满足我要求的解决方案。

我正在使用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事件中清除。没有什么能阻止这种例外。

再次感谢您的帮助!

4 个答案:

答案 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属性。我喜欢直接在方法上方看到参数约束。