OWIN WebApp导致多个函数调用

时间:2018-01-11 13:33:14

标签: c# winforms owin

我担心这是一个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

为什么?

1 个答案:

答案 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)))