如何有力地捕获Controller / Action Not Found错误

时间:2018-03-22 10:44:41

标签: c# asp.net-mvc

我们正在使用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并在HttpException附近抓住InvokeAction(),但我不相信这种方法,因为它似乎不仅仅是缺少行动错误。
  3. 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()

1 个答案:

答案 0 :(得分:0)

我们最终在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.
}