【问题标题】:How to robustly catch Controller/Action Not Found errors如何稳健地捕获 Controller/Action Not Found 错误
【发布时间】:2018-08-31 18:30:06
【问题描述】:

我们正在使用 ASP.NET MVC 5.2.3。

捕获表单异常的最佳方法是什么(最正交/解耦,最简单)

The controller for path '/MissingController/MissingAction' was not found or does not implement IController.

A public action method 'MissingAction' was not found on controller 'ExistingController'.

这样他们就无法达到我们在HttpApplication.Application_Error() 中的最后手段错误处理?

我们知道一些部分解决方案:

Catching action method not found on controller 提出了两种解决方案来处理丢失操作的情况:

  1. 在基本控制器中覆盖 HandleUnknownAction()(缺点:所有控制器都必须继承自该控制器)。
  2. 实现一个自定义 AsyncControllerActionInvoker 并在 InvokeAction() 周围捕获 HttpException,但我不相信这种方法,因为它似乎不仅仅捕获了丢失的操作错误。

http://www.jomendez.com/2016/01/20/how-to-create-custom-controller-factory-asp-net/ 建议实现自定义控制器工厂。我不清楚如果找不到控制器,我们将如何重定向到 404 错误页面。

请注意,我们确实通过 Web.config 提供自定义 404 和 500 错误页面:

<system.web>
    <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
        <error statusCode="404" redirect="~/404.aspx"/>
        <error statusCode="500" redirect="~/500.aspx"/>
    </customErrors>
    ...
</system.web>
<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly">
        <remove statusCode="404"/>
        <error statusCode="404" path="404.html" responseMode="File"/>
        <remove statusCode="500"/>
        <error statusCode="500" path="500.html" responseMode="File"/>
    </httpErrors>
    ...
</system.webServer>

但尽管有这些例外情况仍会到达HttpApplication.Application_Error()

【问题讨论】:

  • Application_Error 全球注册一个活动怎么样?
  • @D-Shih 我们已经覆盖了Application_Error(),但这并不是重点。我的问题是关于识别然后忽略与未找到控制器/操作相关的异常。

标签: c# asp.net-mvc


【解决方案1】:

我们只是在HttpApplication.Application_Error() 中完成了以下操作:

var ex = Server.GetLastError();
var httpException = ex as HttpException;

if (httpException == null || httpException.GetHttpCode() != 404)
{
    // Not an HttpException, or HTTP error other than 404.
    // Here: log error, send alert, etc.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2015-07-21
    • 1970-01-01
    • 2013-10-05
    • 2016-03-10
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多