22

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

这是启动它的调用:

WebApp.Start<PushServerStartup>("http://localhost:8080/events");

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

public class PushServerStartup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapHubs();
    }
}

我在控制台应用程序中运行它,该应用程序执行许多其他操作,包括将跟踪写入某些文件等。但突然之间(当激活 OWIN 托管时)我看到写入控制台的跟踪消息通常路由到某处别的。

显然,在 OWIN 托管框架中有一些活动的跟踪侦听器。我怎样才能关闭它们?

4

3 回答 3

24

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

我只是删除了 TraceListener 实例

Trace.Listeners.Remove("HostingTraceListener")

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

我做了这个之后

WebApp.Start(...
于 2014-03-07T15:39:31.847 回答
12

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

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

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

public class NullTraceOutputFactory : ITraceOutputFactory
{
    public TextWriter Create(string outputFile)
    {
        return StreamWriter.Null;
    }
}
于 2014-03-11T13:25:52.940 回答
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();
}

这是一个虚拟跟踪工厂(也许不是最好的解决方案,但您可以用更好地服务于您的目的的东西来替换它):

public class DummyFactory : ITraceOutputFactory
{
    public TextWriter Create(string outputFile)
    {
        return TextWriter.Null;
    }
}
于 2013-07-31T10:57:26.217 回答