gpt4 book ai didi

asp.net - MVC [HandleError] 使用全局日志记录时调用 HandleErrorAttribute 两次

转载 作者:行者123 更新时间:2023-12-02 02:50:46 26 4
gpt4 key购买 nike

在我使用的 MVC3 Web 应用程序中

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}

应用全局错误处理,如果发生未处理的异常,则会向用户显示“错误” View 。

对于一个特定的 View ,如果发生未处理的异常,我还希望通过用 [HandleError(View = "SpecialError")] 装饰该方法来显示不同的错误 View 。 。这工作得很好。

然后我想添加未处理异常的全局日志记录。我使用日志代码创建了一个自定义 HandleError 属性:

public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Write to log code
base.OnException(context);
}
}

并更新了 RegisterGlobalFilters 和方法装饰以改用此属性名称。这通常有效,但是当用 MyHandleError(View = "SpecialError")] 修饰的方法中发生异常时OnException 方法被调用两次。我最初认为用此属性装饰方法会取代全局处理程序,但似乎只是将其添加到(这更有意义,但这不是我想要的)。通过调用 OnException 两次,相同的异常会被记录两次,这是绝对不能发生的。我不认为 OnException 被调用两次因为它是一个自定义属性 - 我相信标准 HandleError 属性也会发生这种情况,它现在在我创建它的记录时可见。

最终,我想记录所有未处理的异常(一次),同时保留 [HandleError] 提供的功能,特别是为特定方法异常设置不同的 View 。有没有一种干净的方法可以做到这一点?

最佳答案

我相信我自己找到了一个干净的解决方案。扩展 HandleError 似乎是一个好主意,但现在我认为这是朝着错误方向迈出的一步。我不想以不同的方式处理任何错误,只需在 HandleError 拾取它们之前编写异常记录一次即可。因此,默认的 HandleError 可以保留原样。尽管 OnException 可以被多次调用,但它在 HandleErrorAttribute 的标准实现中似乎完全是良性的。

相反,我创建了一个异常日志过滤器:

public class LoggedExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
// logging code
}
}

它不需要太继承FilterAttribute,因为它只需在 RegisterGlobalFilters 中与 HandleErrorAttribute 一起注册一次即可。

 public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new LoggedExceptionFilter());
filters.Add(new HandleErrorAttribute());
}

这允许在不更改标准[HandleError]功能的情况下整齐地记录异常

关于asp.net - MVC [HandleError] 使用全局日志记录时调用 HandleErrorAttribute 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11449895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com