.NET WebApp.Start()触发失控跟踪;库错误或使用错误?

w46czmvw  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(131)

我在.NET库代码中发现了一些感觉像是(小)bug的东西,我想检查一下我是否以某种方式错误地配置了用法?
我有一个C# Web API,使用OWIN并在.NET 4.6.1上运行(叹气)
在IntegrationTests期间,我们在内存中旋转API示例并插入它。(我正在研究独立修复)我们在每次测试时启动一个新的API示例。我最近发现,如果我有一个nlog跟踪记录跟踪到“VSConsole”目标,则写入一行Trace实际上会将其写入N次,其中N是到目前为止已经运行的测试的数量。深入研究后我发现原因在于Microsoft.Owin.Hosting.WebApp.Start():再往下几层,该方法调用Microsoft.Owin.Hosting.Engine.HostingEngine.Start()Microsoft.Owin.Hosting.Engine.HostingEngine.Start()调用EnableTracing(),如下所示:

private void EnableTracing(StartContext context)
{
  TextWriterTraceListener writerTraceListener = new TextWriterTraceListener(context.TraceOutput, "HostingTraceListener");
  Trace.Listeners.Add((TraceListener) writerTraceListener);
  TraceSource traceSource = new TraceSource("HostingTraceSource", SourceLevels.All);
  traceSource.Listeners.Add((TraceListener) writerTraceListener);
  context.Builder.Properties["host.TraceOutput"] = (object) context.TraceOutput;
  context.Builder.Properties["host.TraceSource"] = (object) traceSource;
  context.Builder.SetLoggerFactory(this._loggerFactory);
}

值得注意的是,这是在不检查任何现有侦听器的情况下添加侦听器。因此,如果您重复启动和关闭新的WebApps,则会向Trace.Listeners集合添加越来越多的侦听器。这意味着当您跟踪到它时,它会重复写出到VSConsole。
我已经检查过了,在WebApp.Start()IDisposable输出中没有任何内容看起来像是它试图删除侦听器。
这......似乎是一个错误:D

直接问题

  • 我是否在某些方面使用不当/配置不当?
  • 这是.NET/OWIN代码中的错误吗?
  • 如果是,它是否仍存在于最新的.NET中?
  • 如果是,我应该在哪里报告?
  • 有没有一个合理的方法来解决我的测试中的问题?有没有一些方法来清理测试之间的侦听器?
waxmsbnn

waxmsbnn1#

在每个WebApp启动之前调用Trace.Listeners.Clear();可以修复问题的症状;确保一次只有一个监听器处于活动状态。

相关问题