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

问题描述 投票:1回答:1

我们正在使用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(),但我不相信这种方法,因为它似乎捕获的不仅仅是缺少动作错误。

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()

c# asp.net-mvc
1个回答
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.
}
© www.soinside.com 2019 - 2024. All rights reserved.