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