【问题标题】:Using of HandleErrorAttribute in ASP.NET MVC application在 ASP.NET MVC 应用程序中使用 HandleErrorAttribute
【发布时间】:2013-09-26 10:41:45
【问题描述】:

我有一个关于在我的 MVC 5 应用程序中使用 HandleErrorAttribute 的最佳方式的问题。 我们知道,我们可以像这样将这个属性添加到全局过滤器中:

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

这涉及到应用程序每次在任何级别的应用程序中引发未处理的异常时都显示“错误”视图。 但是,如果我在另一个全局授权或操作过滤器中有一些逻辑,会产生一些异常,那么当第一次抛出异常时,应用程序会尝试重定向到错误视图,其他过滤器再次开始执行并产生相同的异常同样,为了避免循环,asp.net 会终止应用程序。 那么使用这个 HandleErrorAttribute 来避免这种行为的最佳方法是什么? 谢谢!

编辑: 经过一些调试后,我发现这不是 HandleErrorAttribute 的常见行为,因此只有在我使用自定义路由 f.e. 时才会发生循环。

{key}/{controller}/{action}

当过滤器逻辑发生错误时,应用程序会尝试重定向到错误视图,但另一个过滤器逻辑再次开始执行,我什至在 {key} 路由参数中看到“错误”值,所以这是不受欢迎的行为。 当我使用默认路由{controller}/{action} 这不会发生,我没有第二次执行任何全局过滤器逻辑就直接进入错误视图。

【问题讨论】:

    标签: c# asp.net-mvc attributes asp.net-mvc-5


    【解决方案1】:

    您应该将您的操作过滤器逻辑包装在 try catch 中,然后在 catch 块中,重定向到 Error 视图并传递 Exception

    您唯一的其他选择是完全放弃 HandleError 并使用 Global.asax 中的 Application_Error 事件来管理您的错误处理。这样,无论错误发生在哪里,您都可以重定向到里面的 Error 操作。

    【讨论】:

    • 谢谢!这是一个不错的方法。
    • 使用 ELMAH 怎么样?
    • @Murali 老实说我不是 ELMAH 的粉丝
    • 各位,你们觉得我在编辑中添加了什么?自定义路由可以获取到 HandleErrorAttriubute 的这种不正确行为吗?因为我重新检查了两次,当它默认路由时,它按预期工作得很好,没有任何其他过滤器逻辑触发两次
    • @mattytommo 出于好奇,你对 elmah 有什么看法?
    【解决方案2】:

    Matt 对 global.asax 的看法是正确的...这是我遵循的示例 http://www.digitallycreated.net/Blog/57/getting-the-correct-http-status-codes-out-of-asp.net-custom-error-pages

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

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 2013-01-07
      • 2010-09-21
      相关资源
      最近更新 更多