OWIN自托管中的TraceListener

mei*_*lke 20 c# owin

Microsoft.Owin.Hosting用来托管以下非常简单的网络应用程序.

这是启动它的电话:

WebApp.Start<PushServerStartup>("http://localhost:8080/events");
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的启动类:

public class PushServerStartup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapHubs();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在一个控制台应用程序中运行它,它执行许多其他操作,包括路由跟踪写入某些文件等.但突然(当激活OWIN主机时)我看到写入控制台的跟踪消息通常在某处发送其他.

显然,在OWIN托管框架中有一些活动的跟踪监听器.我该怎么关掉它们?

Blu*_*tUK 22

我遇到了同样的问题,我在一个进程中自己托管了4个实例,并且每个请求都获得了4个跟踪到控制台的消息.

我只是删除了TraceListener实例

Trace.Listeners.Remove("HostingTraceListener")
Run Code Online (Sandbox Code Playgroud)

"HostingTraceListener"在owin源代码中定义,所以我想可以改变 - http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Hosting/Engine/HostingEngine.cs

我之后做了这个

WebApp.Start(...
Run Code Online (Sandbox Code Playgroud)


小智 12

替代meilke的答案与最新的Katana自托管(2.1.0)一起使用:

StartOptions options = new StartOptions("http://localhost:8080/events");

// disable built-in owin tracing by using a null traceoutput
options.Settings.Add(
    typeof(Microsoft.Owin.Hosting.Tracing.ITraceOutputFactory).FullName,
    typeof(NullTraceOutputFactory).AssemblyQualifiedName);

using (WebApp.Start<PushServerStartup>(options))
Run Code Online (Sandbox Code Playgroud)

NullTraceOutputFactory类似于DummyFactory但使用StreamWriter.Null而不是StringWriter:

public class NullTraceOutputFactory : ITraceOutputFactory
{
    public TextWriter Create(string outputFile)
    {
        return StreamWriter.Null;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使用StreamWriter.Null有一个多线程竞争条件,因为当未连​​接任何控制台(例如从Windows Services)时,Console.Write *也会使用它。最好使用`TextWriter.Synchronized(new StreamWriter(Stream.Null))`。 (2认同)

mei*_*lke 1

我自己找到了解决方案。研究完 Katana 源代码后,您似乎需要注册自己的ITraceOutputFactory实例来推翻默认跟踪侦听器(正在写入控制台)。

这是新的开始调用:

var dummyFactory = new DummyFactory();
var provider = ServicesFactory.Create(
    defaultServiceProvider => defaultServiceProvider.AddInstance<ITraceOutputFactory>(dummyFactory));

using (WebApp.Start<Startup>(provider, new StartOptions("http://localhost:8090")))
{
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

这是一个虚拟跟踪工厂(也许不是最好的解决方案,但您可以将其替换为更好地满足您的目的的东西):

public class DummyFactory : ITraceOutputFactory
{
    public TextWriter Create(string outputFile)
    {
        return TextWriter.Null;
    }
}
Run Code Online (Sandbox Code Playgroud)