我刚刚将Application Insights安装到我的ASP.NET MVC应用程序中。它实际上是Umbraco网站,注册稍有不同,但结果应该相同。
安装该软件包时,它为我添加了一些代码,以全局注册一个名为“ AiHandleErrorAttribute”的新异常操作过滤器。
我正在使用事件处理程序以Umbraco方式注册它:
public class RegisterAIEventHandler : ApplicationEventHandler
{
protected override void ApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
base.ApplicationInitialized(umbracoApplication, applicationContext);
GlobalFilters.Filters.Add(new ErrorHandler.AiHandleErrorAttribute());
}
}
这是动作过滤器代码:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AiHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null)
{
//If customError is Off, then AI HTTPModule will report the exception
if (filterContext.HttpContext.IsCustomErrorEnabled)
{
var ai = new TelemetryClient();
ai.TrackException(filterContext.Exception);
}
}
base.OnException(filterContext);
}
}
无论何时引发异常,都不会触发操作过滤器,但仍会在Application Insights中正确记录该异常。
当我检查所有全局动作过滤器时,我注意到Application Insights自动注册了另一个动作过滤器。
所以我有几个问题:
编辑:未触发自定义操作过滤器的原因是,在进入Controller Pipeline之前抛出了我故意引起的异常。现在,我在控制器内部触发了一个异常,实际上它已被调用。
尽管如此,我仍然质疑为什么要自动添加一个动作过滤器,以及是否也应该添加自定义AiHandleErrorAttribute。
答案 0 :(得分:4)
我也刚遇到这个问题。我的例外记录在AI中记录了两次。
事实证明,从2.6版(2018年4月)a global filter is automatically added开始。如果您以前曾阅读过文档并自行进行过设置,则现在所有内容都会记录两次。
添加的looks like this全局过滤器:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class MvcExceptionFilter : HandleErrorAttribute
{
public const bool IsAutoInjected = true;
private readonly TelemetryClient telemetryClient = new TelemetryClient();
public MvcExceptionFilter(TelemetryClient tc) : base()
{
telemetryClient = tc;
}
public override void OnException(ExceptionContext filterContext)
{
if (filterContext != null && filterContext.HttpContext != null && filterContext.Exception != null && filterContext.HttpContext.IsCustomErrorEnabled)
telemetryClient.TrackException(new ExceptionTelemetry(filterContext.Exception));
}
}
}
如果您没有向文档中先前提供的AiHandleErrorAttribute添加任何内容,则可以将其删除并让自动生成的内容处理所有内容。
如果您确实想使用自己的版本,要对其进行更多控制(例如忽略某些例外),可以disable the automatic exception tracking。 将此添加到您的ApplicationInsights.config:
<Add Type="Microsoft.ApplicationInsights.Web.ExceptionTrackingTelemetryModule, Microsoft.AI.Web">
<EnableMvcAndWebApiExceptionAutoTracking>false</EnableMvcAndWebApiExceptionAutoTracking>
</Add>
请注意,ExceptionTrackingTelemetryModule元素将已经存在,只需将设置添加到其中即可。