10

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

我正在使用 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]装饰所有控制器的属性。这可能吗?如果是这样,我将不胜感激。

我尝试过设置重定向的最终路由,但无论出于何种原因,它都匹配之前的路由。我试图使用httpModuleApplication_Error ,并在文件的情况下清除Global.asax。没有什么能阻止例外。

再次感谢任何帮助!

4

4 回答 4

4

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

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

于 2010-07-09T12:31:43.753 回答
2

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

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

于 2010-06-25T23:22:40.907 回答
1

在围绕这个异常进行大量挖掘之后,可能没有正确地传达我的问题。根据这篇文章,答案是从 ELMAH 中排除这些例外。

By default, ELMAH logs the details of every unhandled exception, including 404 and other HTTP errors. You can instruct ELMAH to ignore these or other types of errors using error filtering.

于 2010-09-08T18:37:56.890 回答
0

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

于 2010-06-25T23:34:38.663 回答