我在.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中?
- 如果是,我应该在哪里报告?
- 有没有一个合理的方法来解决我的测试中的问题?有没有一些方法来清理测试之间的侦听器?
1条答案
按热度按时间waxmsbnn1#
在每个WebApp启动之前调用
Trace.Listeners.Clear();
可以修复问题的症状;确保一次只有一个监听器处于活动状态。