我将ASP.NET MVC 3应用程序配置为通过两个操作重定向到Errors
控制器 -
<customErrors mode="On" defaultRedirect="/Errors/ApplicationError">
<error statusCode="404" redirect="/Errors/NotFound" />
</customErrors>
我有几个从每个动作方法呈现的视图:
/Views/Shared/NotFound.cshtml
/Views/Shared/ApplicationError.cshtml
在我的ErrorsController
ApplicationError
行动中,我执行以下操作:
public ActionResult ApplicationError()
{
Response.StatusCode = 500;
return View();
}
这样可以实现我的ApplicationError.cshtml
视图,无论发生什么异常都记录下来,一切都很好。
然而,在ELMAH中,我发现记录了这个额外的错误:
System.InvalidOperationException 未找到视图“错误”或其主控,或者没有视图引擎支持搜索的位置。搜索了以下位置:〜/ Views / Throw / Error.aspx~ / Views / Throw / Error.ascx~ / Views / Shared / Error.aspx~ / Views / Shared / Error.ascx~ / Views / Throw / Error。 cshtml~ / Views / Throw / Error.vbhtml~ / Views / Shared / Error.cshtml~ / Views / Shared / Error.vbhtml
为什么当我已经处理错误并且我自己的视图已成功定位并呈现时,ASP.NET MVC仍然在寻找这些视图?
其他信息:
我不在任何地方使用[HandleError]
属性
我将filters.Add(new HandleErrorAttribute());
中的Global.asax.cs
替换为filters.Add(new ElmahHandleErrorAttribute());
{{1}} this advice,Stack Overflow answer基于author of ELMAH Atif {{3}}
答案 0 :(得分:3)
我认为,虽然您已将HandleErrorAttribute
替换为派生类(ElmahHandleErrorAttribute
),但您的自定义属性OnException
可能仍在调用base.OnException
- 即HandleErrorAttribute.OnException
HandleErrorAttribute.OnException
完全忽略web.config设置(除非让customErrors关闭时让ASP.NET显示标准YSOD),并将操作结果设置为状态码为500的ViewResult
,并View
设置为“错误”(默认情况下,当尚未在属性上设置View
属性时)。
即,我猜这样的事情发生了:
ElmahHandleErrorAttribute
选择它,记录异常,调用base.OnException
HandleErrorAttribute.OnException
将操作结果设置为ViewResult
,View
设置为“错误”ElmahHandleErrorAttribute
选中(因为此异常发生在操作之外)...但实际上并不是你抛出的异常,而是ViewEngine投掷的异常。
如果希望遵循web.config设置,您可能希望实现自己的异常处理,而不是基于HandleError。查看MVC源代码中的HandleErrorAttribute
(here),看看需要做什么(以及在您的情况下不应该做什么)。