我们正在使用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提出了两种解决方案来处理缺失行为的情况:
HandleUnknownAction()
(缺点:所有控制器必须从该控制器继承)。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()
。
答案 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.
}