2013-07-30 15 views
16

Używam Microsoft.Owin.Hosting do obsługi poniższej, bardzo prostej aplikacji internetowej.TraceListener w OWIN Self Hosting

Oto wezwanie, aby go uruchomić:

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

Oto klasa startowego Używam:

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

Używam tego wewnątrz aplikacji konsoli, która robi wiele innych rzeczy w tym routing zapisu zapisu do niektórych plików itp. Jednak nagle (po aktywowaniu hostingu OWIN) widzę komunikaty śledzenia zapisane na konsoli, które zwykle są kierowane gdzie indziej.

Oczywiście w środowisku OWIN istnieje kilka detektorów śledzenia. Jak mogę je wyłączyć?

+0

widzę to samo, ale wydaje się znikać podczas budowy w wydaniu więc myślę, że słuchacz ślad dodaje się tylko w debugowania buduje . – osexpert

Odpowiedz

1

Sam znalazłem rozwiązanie. Po zapoznaniu się z kodem źródłowym Katana wydaje się, że musisz zarejestrować własną instancję ITraceOutputFactory, aby uchylić domyślny program nasłuchujący śledzenia (zapisujący go na konsoli).

Oto nowe połączenie start:

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(); 
} 

I tu jest obojętne fabryka trace (być może nie jest najlepszym rozwiązaniem, ale można zastąpić go czymś służąc swój cel trochę lepiej):

public class DummyFactory : ITraceOutputFactory 
{ 
    public TextWriter Create(string outputFile) 
    { 
     return TextWriter.Null; 
    } 
} 
15

Miałem ten sam problem, samodzielnie zarządzałem 4 instancjami w jednym procesie, a dla każdego żądania uzyskiwano 4 partie komunikatów przypisanych do konsoli.

po prostu usuwa instancję TraceListener

Trace.Listeners.Remove("HostingTraceListener") 

"HostingTraceListener" jest zdefiniowany w kodzie źródłowym owin więc myślę, że może zmienić - http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Hosting/Engine/HostingEngine.cs

Zrobiłem to po

WebApp.Start(... 
+1

Jedyne rozwiązanie, które zadziałało dla mnie. Microsoft.Owin.Hosting 2.0.2 – mortalapeman

+0

Dobra robota! To jest właściwe rozwiązanie mojego problemu! Jeśli "HostingTraceListener" zmieni się, możesz zapętlić poufne dane śledzenia Trace.Listeners i odszukać odbiorcę do usunięcia. Jeśli zwykle masz tylko jednego słuchacza (domyślny), możesz usunąć pozostałe, nie znając ich. Na przykład: 'while (Trace.Listeners.Count> 1) Trace.Listeners.RemoveAt (1);' – tedebus

10

Alternatywa dla odpowiedzi od meilke, która działa z najnowszym samodzielnym hostem 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 jest podobna do DummyFactory ale stosując StreamWriter.Null zamiast StringWriter:

public class NullTraceOutputFactory : ITraceOutputFactory 
{ 
    public TextWriter Create(string outputFile) 
    { 
     return StreamWriter.Null; 
    } 
} 
+1

Należy pamiętać, że istnieje warunek wyścigu wielowątkowego z użyciem 'StreamWriter.Null', ponieważ jest on również używany przez' Console.Write * ', gdy nie jest podłączona żadna konsola, np. z usług Windows. Lepiej używać zamiast tego 'TextWriter.Synchronized (nowy StreamWriter (Stream.Null)). –