<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
The view ‘Error’ or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/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());根据this advice,由Atif author of ELMAH基于此Stack Overflow answer.
解决方法
HandleErrorAttribute.OnException完全忽略web.config设置(除非让customErrors关闭,让ASP.NET显示标准YSOD),并将操作结果设置为状态代码为500的ViewResult,并将View设置为“Error”(默认情况下,尚未在属性上设置View属性).
即,我猜这样的事情发生了:
>你抛出一个例外
> ElmahHandleErrorAttribute选择它,记录异常,调用base.OnException
> HandleErrorAttribute.OnException将操作的结果设置为ViewResult,并将View设置为“Error”
> ViewEngine无法找到此“错误”视图,因此抛出新的异常
> …由ELMAH记录,但未被ElmahHandleErrorAttribute记录(因为此异常发生在动作之外)
>相反,ASP.NET本身会选择它,并使用web.config中的errorPages
> …调用/错误/ ApplicationError
> …显示您想要的视图
…但实际上并不是你抛出的异常,而是ViewEngine抛出的异常.
如果希望遵循web.config设置,您可能希望实现自己的异常处理,而不是基于HandleError.看看MVC源代码中的HandleErrorAttribute(here),看看需要做什么(以及在你的情况下不应该做什么).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。