【问题标题】:Stop exception from being thrown for non-existent controller停止为不存在的控制器引发异常
【发布时间】:2011-03-08 12:18:35
【问题描述】:

好的,所以我被这个问题难住了。我已经看到了很多本应解决此问题的方法,但我没有得到可以满足我要求的解决方案。

我正在使用 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,并清除Global.asax 文件的Application_Error 事件。没有什么能阻止例外。

再次感谢您的帮助!

【问题讨论】:

  • 被记录有什么不好?例如,默认情况下,常规 404 也会登录到 Apache。
  • 这不是日志记录,而是我试图压制的异常。我想要一个 404 错误,因为它应该是 404。但是我的理想情况是让 .NET customErrors 抛出 404 并且不会抛出异常。

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


【解决方案1】:

创建一个 RouteConstraint,检查控制器是否存在(事实上,扫描所有可能的控制器并缓存它,你知道我的意思) 并将其添加到您的标准路线中。

所以,当您向坏控制器发出请求时,正常路由不会接受它。 但随后被包罗万象接受 -> 404 路线......

【讨论】:

    【解决方案2】:

    连接一个自定义控制器工厂,当它无法找到请求的控制器时,它可以执行您想要的功能。就那么几行代码,没什么太痛苦的。

    您可以创建自己的控制器工厂,或使用众多库之一作为起点。您将拥有一个实现 IControllerFactory 的类,并且 CreateController() 函数内部将是您的自定义逻辑。

    【讨论】:

      【解决方案3】:

      可能没有正确传达我的问题,经过大量挖掘应该抛出这个异常。答案是根据article 将这些例外排除在 ELMAH 之外。

      默认情况下,ELMAH 会记录 每个未处理的异常,包括 404 和其他 HTTP 错误。你可以 指示 ELMAH 忽略这些或 其他类型的错误使用错误 过滤。

      【讨论】:

      • This article 正是我想要的,记录错误但不要给我发电子邮件,完美!
      【解决方案4】:

      我使用DSO's ITCloud Contrib。没有{controller}/{action} 通用参数。每个操作方法的显式UrlRoute 属性。我喜欢直接在方法上方看到参数约束。

      【讨论】:

        猜你喜欢
        • 2020-08-23
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多