我担心这是一个XY问题,但我自己找不到解决方案。 为了缩小问题范围,我创建了一个空表单的新C#项目。这里是program.cs代码(从原始问题更新到一个非常小的例子):
public partial class Form1 : Form
{
private IDisposable webApp;
const string url = "http://localhost:8080";
public Form1()
{
InitializeComponent();
Debug.WriteLine("before");
foo();
webApp = WebApp.Start<Startup>(url);
Debug.WriteLine("after");
foo();
}
private void foo()
{
Debug.WriteLine("foo");
}
}
class Startup
{
public void Configuration(IAppBuilder app) { }
}
这里(奇怪的)输出:
before
foo
after
after
after
foo
foo
foo
删除WebApp.Start
来电会产生预期的输出:
before
foo
after
foo
为什么?
答案 0 :(得分:1)
这种情况正在发生,因为内部Debug.Writeline
使用跟踪侦听器。如果您在Trace.Listeners
行之前和之后检查WebApp.Start
集合,您会注意到该网络应用正在添加第二个跟踪侦听器。因此,您的日志消息将被执行一次,但正在写入&#34; log&#34;多次,因为有额外的听众。
应用程序以单个DefaultTraceListener
开始,然后Web应用程序启动TextWriterTraceListener
。您可以通过将此添加到配置中来删除额外的侦听器:
Trace.Listeners.Remove("HostingTraceListener");
解决此问题的第二个选项是实现您自己的ITraceOutputFactory
:
public class MyFactory: ITraceOutputFactory
{
public TextWriter Create(string outFile)
{
return TextWriter.Null;
}
}
并在您的网络应用中注册:
var myFactory = new MyFactory();
var provider = ServicesFactory.Create(fact => fact.AddInstance<ITraceOutputFactory>(myFactory));
WebApp.Start<Startup>(provider, new StartOptions(url)))