TraceListener в самостоятельном размещении OWIN

Я использую Microsoft.Owin.Hosting для размещения следующего очень простого веб-приложения.

Вот вызов, чтобы запустить его:

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

Вот класс запуска, который я использую:

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

Я запускаю это внутри консольного приложения, которое делает много других вещей, включая запись трассировки маршрутизации в определенные файлы и т. д. Но внезапно (при активации хостинга OWIN) я вижу сообщения трассировки, написанные на консоли, которые обычно куда-то направляются еще.

Очевидно, что в структуре хостинга OWIN активны некоторые прослушиватели трассировки. Как я могу отключить их?


person meilke    schedule 30.07.2013    source источник
comment
Я вижу то же самое, но, похоже, исчезает при сборке в выпуске, поэтому я думаю, что прослушиватель трассировки добавляется только в отладочные сборки.   -  person osexpert    schedule 26.11.2017


Ответы (3)


У меня была та же проблема, я самостоятельно размещал 4 экземпляра в одном процессе, и для каждого запроса я получал 4 партии сообщений, отслеживаемых на консоль.

Я просто удалил экземпляр TraceListener

Trace.Listeners.Remove("HostingTraceListener")

«HostingTraceListener» определен в исходном коде owin, поэтому я думаю, что он может измениться — http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Hosting/Engine/HostingEngine.cs

я сделал это после

WebApp.Start(...
person BlueGhostUK    schedule 07.03.2014
comment
Единственное решение, которое действительно сработало для меня. Microsoft.Owin.Хостинг 2.0.2 - person mortalapeman; 01.04.2014
comment
Отличная работа! Это правильное решение моего вопроса! Если HostingTraceListener изменится, вы можете зациклить инсайдерские Trace.Listeners и найти прослушиватель, который нужно удалить. Если у вас обычно есть только один слушатель (по умолчанию), вы можете удалить остальных, не зная их. Например: 'в то время как (Trace.Listeners.Count › 1) Trace.Listeners.RemoveAt(1);' - person tedebus; 03.02.2017

Альтернатива ответу от 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))

NullTraceOutputFactory похож на DummyFactory, но использует StreamWriter.Null вместо StringWriter:

public class NullTraceOutputFactory : ITraceOutputFactory
{
    public TextWriter Create(string outputFile)
    {
        return StreamWriter.Null;
    }
}
person sidhoda    schedule 11.03.2014
comment
Имейте в виду, что существует многопоточное состояние гонки с использованием StreamWriter.Null, поскольку оно также используется Console.Write*, когда консоль не подключена, например. из служб Windows. Вместо этого лучше использовать TextWriter.Synchronized(new StreamWriter(Stream.Null)). - person Sean Fausett; 27.07.2016

Я сам нашел решение. После изучения исходного кода 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;
    }
}
person meilke    schedule 31.07.2013