添加 Microsoft ApplicationInsights Telemetry 后出现 OutOfMemoryException
OutOfMemoryException after adding Microsoft ApplicationInsights Telemetry
我们最近在我们的网站上添加了遥测技术(我们一直是 运行 由 Microsoft Azure 门户自动添加的遥测技术),但现在我已经使用配置文件 nugets 实现了页面视图和整个机制等等。
然后在发布后,它 运行 持续了几天,然后在午夜左右爆炸,(我知道我应该点燃蜡烛并让一位俄罗斯教皇祝福服务器,因为邪恶势力显然已经参与其中)。
异常:
Castle.MicroKernel.ComponentActivator.ComponentActivatorException:
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.CreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Handlers.DefaultHandler.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Handlers.AbstractHandler.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.DefaultKernel.ResolveComponent (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.DefaultKernel.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at xxx.yyy.Globals.WindsorControllerFactory.GetControllerInstance (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\s\source\yyy\Globals\WindsorControllerFactory.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 29)
at System.Web.Mvc.DefaultControllerFactory.CreateController (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.Mvc.MvcHandler.ProcessRequestInit (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+<>c__DisplayClass285_0.<ExecuteStepImpl>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker+<>c__DisplayClass4_0.<Invoke>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.OnExecuteRequestStep (Microsoft.AspNet.TelemetryCorrelation, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.HttpApplication+<>c__DisplayClass284_0.<OnExecuteRequestStep>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker+<>c__DisplayClass4_0.<Invoke>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule.OnExecuteRequestStep (Microsoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\WEB\Src\Web\Web.Shared.Net\ApplicationInsightsHttpModule.csMicrosoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 164)
at System.Web.HttpApplication+<>c__DisplayClass284_0.<OnExecuteRequestStep>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication.ExecuteStepImpl (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication.ExecuteStep (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
Inner exception System.Reflection.TargetInvocationException handled at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore:
at System.RuntimeMethodHandle.InvokeMethod (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Reflection.RuntimeConstructorInfo.Invoke (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.FastCreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
Inner exception System.Threading.Tasks.TaskSchedulerException handled at System.RuntimeMethodHandle.InvokeMethod:
at System.Threading.Tasks.Task.ScheduleAndStart (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Tasks.Task.InternalStartNew (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Tasks.TaskFactory.StartNew (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at Microsoft.ApplicationInsights.Channel.InMemoryTransmitter..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\BASE\src\Microsoft.ApplicationInsights\Channel\InMemoryTransmitter.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 45)
at Microsoft.ApplicationInsights.Channel.InMemoryChannel..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\BASE\src\Microsoft.ApplicationInsights\Channel\InMemoryChannel.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 33)
at Microsoft.ApplicationInsights.Extensibility.TelemetrySink..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\BASE\src\Microsoft.ApplicationInsights\Extensibility\TelemetrySink.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 45)
at Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\BASE\src\Microsoft.ApplicationInsights\Extensibility\TelemetryConfiguration.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 95)
at xxx.yyy.Controllers.BaseController..ctor (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\s\source\yyy\Controllers\BaseController.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 15)
at xxx.yyy.Controllers.ExportController..ctor (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\s\source\yyy\Controllers\ExportController.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 24)
Inner exception System.OutOfMemoryException handled at System.Threading.Tasks.Task.ScheduleAndStart:
at System.Threading.Thread.StartInternal (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Thread.Start (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Thread.Start (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Tasks.ThreadPoolTaskScheduler.QueueTask (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Tasks.Task.ScheduleAndStart (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
代码:
public class BaseController : Controller, IyyyController
{
private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));
...
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var user = ViewBag.CurrentUser = db.GetCurrentUser();
SendApplicationInsightsTelemetry(filterContext, user);
}
private void SendApplicationInsightsTelemetry(ActionExecutingContext filterContext, User user)
{
try
{
PageViewTelemetry telemetrypageView = new PageViewTelemetry()
{
Name = filterContext?.HttpContext?.Request?.RawUrl,
Url = filterContext?.HttpContext?.Request?.Url
};
if (filterContext.HttpContext.Session["Id"] == null)
filterContext.HttpContext.Session["Id"] = Guid.NewGuid().ToString();
telemetrypageView.Context.Session.Id = filterContext.HttpContext.Session["Id"].ToString();
if (user != null)
{
telemetrypageView.Context.User.Id = user.zzz.ToString();
telemetrypageView.Context.User.AccountId = user.ooo;
}
telemetry.TrackPageView(telemetrypageView);
}
catch (Exception e)
{
Trace.TraceError($"{nameof(SendApplicationInsightsTelemetry)}, {e.Message}");
}
}
有疑问的是:
private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));
上面的代码会导致内存泄漏还是更隐蔽的原因?
答案是也许。 TelemetryClient
不是 IDisposable
但 TelemetryConfiguration
是,所以:
替换后
private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));
和
private readonly TelemetryClient telemetry;
private readonly Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration telemetryConfiguration;
protected BaseController(ProjectPlanContext dbContext)
{
telemetryConfiguration = new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]);
telemetry = new TelemetryClient(telemetryConfiguration);
}
protected override void Dispose(bool disposing)
{
telemetryConfiguration.Dispose();
base.Dispose(disposing);
}
它再也没有回来
我们最近在我们的网站上添加了遥测技术(我们一直是 运行 由 Microsoft Azure 门户自动添加的遥测技术),但现在我已经使用配置文件 nugets 实现了页面视图和整个机制等等。
然后在发布后,它 运行 持续了几天,然后在午夜左右爆炸,(我知道我应该点燃蜡烛并让一位俄罗斯教皇祝福服务器,因为邪恶势力显然已经参与其中)。
异常:
Castle.MicroKernel.ComponentActivator.ComponentActivatorException:
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.CreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Handlers.DefaultHandler.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.Handlers.AbstractHandler.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.DefaultKernel.ResolveComponent (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.DefaultKernel.Resolve (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at xxx.yyy.Globals.WindsorControllerFactory.GetControllerInstance (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\s\source\yyy\Globals\WindsorControllerFactory.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 29)
at System.Web.Mvc.DefaultControllerFactory.CreateController (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.Mvc.MvcHandler.ProcessRequestInit (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+<>c__DisplayClass285_0.<ExecuteStepImpl>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker+<>c__DisplayClass4_0.<Invoke>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.OnExecuteRequestStep (Microsoft.AspNet.TelemetryCorrelation, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
at System.Web.HttpApplication+<>c__DisplayClass284_0.<OnExecuteRequestStep>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker+<>c__DisplayClass4_0.<Invoke>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule.OnExecuteRequestStep (Microsoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\WEB\Src\Web\Web.Shared.Net\ApplicationInsightsHttpModule.csMicrosoft.AI.Web, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 164)
at System.Web.HttpApplication+<>c__DisplayClass284_0.<OnExecuteRequestStep>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication.ExecuteStepImpl (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
at System.Web.HttpApplication.ExecuteStep (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
Inner exception System.Reflection.TargetInvocationException handled at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore:
at System.RuntimeMethodHandle.InvokeMethod (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Reflection.RuntimeConstructorInfo.Invoke (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.FastCreateInstance (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
at Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstanceCore (Castle.Windsor, Version=3.3.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc)
Inner exception System.Threading.Tasks.TaskSchedulerException handled at System.RuntimeMethodHandle.InvokeMethod:
at System.Threading.Tasks.Task.ScheduleAndStart (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Tasks.Task.InternalStartNew (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Tasks.TaskFactory.StartNew (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at Microsoft.ApplicationInsights.Channel.InMemoryTransmitter..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\BASE\src\Microsoft.ApplicationInsights\Channel\InMemoryTransmitter.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 45)
at Microsoft.ApplicationInsights.Channel.InMemoryChannel..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\BASE\src\Microsoft.ApplicationInsights\Channel\InMemoryChannel.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 33)
at Microsoft.ApplicationInsights.Extensibility.TelemetrySink..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\BASE\src\Microsoft.ApplicationInsights\Extensibility\TelemetrySink.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 45)
at Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration..ctor (Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35Microsoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: E:\A\_work\s\BASE\src\Microsoft.ApplicationInsights\Extensibility\TelemetryConfiguration.csMicrosoft.ApplicationInsights, Version=2.13.1.12554, Culture=neutral, PublicKeyToken=31bf3856ad364e35: 95)
at xxx.yyy.Controllers.BaseController..ctor (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\s\source\yyy\Controllers\BaseController.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 15)
at xxx.yyy.Controllers.ExportController..ctor (xxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=nullxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: D:\a\s\source\yyy\Controllers\ExportController.csxxx.yyy, Version=1.7.25.8804, Culture=neutral, PublicKeyToken=null: 24)
Inner exception System.OutOfMemoryException handled at System.Threading.Tasks.Task.ScheduleAndStart:
at System.Threading.Thread.StartInternal (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Thread.Start (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Thread.Start (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Tasks.ThreadPoolTaskScheduler.QueueTask (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
at System.Threading.Tasks.Task.ScheduleAndStart (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
代码:
public class BaseController : Controller, IyyyController
{
private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));
...
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var user = ViewBag.CurrentUser = db.GetCurrentUser();
SendApplicationInsightsTelemetry(filterContext, user);
}
private void SendApplicationInsightsTelemetry(ActionExecutingContext filterContext, User user)
{
try
{
PageViewTelemetry telemetrypageView = new PageViewTelemetry()
{
Name = filterContext?.HttpContext?.Request?.RawUrl,
Url = filterContext?.HttpContext?.Request?.Url
};
if (filterContext.HttpContext.Session["Id"] == null)
filterContext.HttpContext.Session["Id"] = Guid.NewGuid().ToString();
telemetrypageView.Context.Session.Id = filterContext.HttpContext.Session["Id"].ToString();
if (user != null)
{
telemetrypageView.Context.User.Id = user.zzz.ToString();
telemetrypageView.Context.User.AccountId = user.ooo;
}
telemetry.TrackPageView(telemetrypageView);
}
catch (Exception e)
{
Trace.TraceError($"{nameof(SendApplicationInsightsTelemetry)}, {e.Message}");
}
}
有疑问的是:
private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));
上面的代码会导致内存泄漏还是更隐蔽的原因?
答案是也许。 TelemetryClient
不是 IDisposable
但 TelemetryConfiguration
是,所以:
替换后
private TelemetryClient telemetry = new TelemetryClient(new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]));
和
private readonly TelemetryClient telemetry;
private readonly Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration telemetryConfiguration;
protected BaseController(ProjectPlanContext dbContext)
{
telemetryConfiguration = new Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration(ConfigurationManager.AppSettings["ApplicationInsightKey"]);
telemetry = new TelemetryClient(telemetryConfiguration);
}
protected override void Dispose(bool disposing)
{
telemetryConfiguration.Dispose();
base.Dispose(disposing);
}
它再也没有回来