OWIN WebApp 导致多个函数调用

OWIN WebApp leads to multiple functions calls

恐怕这是一个 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

为什么?

发生这种情况是因为内部 Debug.Writeline 使用了跟踪侦听器。如果您检查 WebApp.Start 行前后的 Trace.Listeners 集合,您会注意到 Web 应用正在添加第二个跟踪侦听器。因此,您的日志消息被执行 一次 ,但多次写入 "log",因为有额外的侦听器。

应用程序以单个 DefaultTraceListener 启动,然后网络应用启动 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)))