在我使用的 MVC3 Web 应用程序中
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
如果发生未处理的异常,则在向用户显示“错误”视图的地方应用全局错误处理。
对于一个特定的视图,我还希望通过使用 [HandleError(View = "SpecialError")]
. 这工作得很好。
然后我想添加未处理异常的全局日志记录。我使用日志记录代码创建了一个自定义 HandleError 属性:
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Write to log code
base.OnException(context);
}
}
并更新了 RegisterGlobalFilters 和方法装饰以改用此属性名称。这通常有效,但是当使用 OnException 方法修饰的方法中发生异常时,MyHandleError(View = "SpecialError")]
会调用两次。我最初假设用这个属性装饰方法取代了全局处理程序,但似乎它只是简单地添加到(这更有意义,但这不是我想要的)。通过调用 OnException 两次,相同的异常会被记录两次,这是绝对不能发生的。我不认为 OnException 被调用了两次,因为它是一个自定义属性——我相信标准的 HandleError 属性也会发生这种情况,它现在在我创建它的记录时是可见的。
最终,我想记录所有未处理的异常(一次),同时保留 [HandleError] 提供的功能,特别是为特定方法异常设置不同的视图。有没有一种干净的方法可以做到这一点?