在ASP.NET MVC应用程序中使用HandleErrorAttribute

我有一个关于在我的MVC 5应用程序中使用HandleErrorAttribute的最佳方法的问题。 我们知道,我们可以将此属性添加到全局filter中:

filters.Add(new HandleErrorAttribute{View = "Error"}); 

这涉及应用程序每次在任何级别的应用程序中抛出未处理的exception时显示“错误”视图。 但是,如果我在其他全局授权或动作filter中有一些逻辑,那产生一些exception,比第一次出现exception时,那么app尝试重定向到Error View,再次其他filter开始执行并再次产生相同的exception,所以asp .net以避免此循环终止应用程序。 那么如何使用这个HandleErrorAttribute来避免这种行为的最佳方法呢? 谢谢!

编辑:经过一些调试我发现这不是HandleErrorAttribute的常见行为,所以只有当我使用自定义路由fe时才会出现这种循环

 {key}/{controller}/{action} 

当filter逻辑中出现一些错误时,app尝试重定向到错误视图,但是另一个filter逻辑再次开始执行,我甚至在{key}路由参数中看到“错误”值,因此这是不需要的行为。 当我使用默认路由{controller}/{action}这不会发生,并且我完全得到错误视图而没有第二次执行任何全局filter逻辑。

您应该将动作filter逻辑包装在try catch ,然后在catch块内,重定向到Error视图并传递Exception

您唯一的另一种选择是完全抛弃HandleError并使用Global.asax中的Application_Error事件来管理您的error handling。 这样,无论发生错误的位置,您都可以重定向到其中的Error操作。

对于global.asax来说Matt是正确的…这是我遵循的例子http://www.digitallycreated.net/Blog/57/getting-the-correct-http-status-codes-out-of-asp.net-自定义错误页

然后在每个视图中我添加:Response.StatusCode = 500; 或者我希望向客户展示其他代码。