2013-07-30 17 views
16

Sto usando Microsoft.Owin.Hosting per ospitare la seguente, molto semplice web app.TraceListener in OWIN Self Hosting

Ecco la chiamata per avviarlo:

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

Qui è la classe di avvio che sto usando:

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

Sto facendo funzionare questo all'interno di un'applicazione console che fa un sacco di altre cose compresi routing traccia di scrittura su determinati file ecc. Ma all'improvviso (quando si attiva l'hosting OWIN) vedo i messaggi di traccia scritti sulla console che normalmente vengono instradati da qualche altra parte.

Ovviamente ci sono alcuni trace lister attivi nel framework di hosting OWIN. Come posso spegnerli?

+0

vedo lo stesso, ma sembra scomparire quando si costruisce nel rilascio quindi credo che il listener di analisi viene aggiunto solo nel build di debug . – osexpert

risposta

1

Ho trovato una soluzione da solo. Dopo aver studiato il codice sorgente di Katana sembra che sia necessario registrare la propria istanza ITraceOutputFactory per sovrascrivere il listener di traccia predefinito (che sta scrivendo sulla console).

Ecco la nuova chiamata di partenza:

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

E qui è una fabbrica traccia fittizio (forse non è la soluzione migliore, ma è possibile sostituirlo con qualcosa che serve il vostro scopo un po 'meglio):

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

Ho avuto lo stesso problema, ero in grado di ospitare 4 istanze in un unico processo e per ogni richiesta ricevevo 4 lotti di messaggi tracciati per console.

ho semplicemente rimosso l'istanza TraceListener

Trace.Listeners.Remove("HostingTraceListener") 

"HostingTraceListener" è definito nel codice sorgente Owin quindi credo che potrebbe cambiare - http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Hosting/Engine/HostingEngine.cs

ho fatto questo dopo

WebApp.Start(... 
+1

Solo la soluzione che ha funzionato in realtà per me. Microsoft.Owin.Hosting 2.0.2 – mortalapeman

+0

Ben fatto! Questa è la soluzione giusta per il mio problema! Se "HostingTraceListener" cambierà, è possibile eseguire il loop di Trider.Listenider all'interno e cercare l'ascoltatore da rimuovere. Se di solito hai un solo listener (quello predefinito) puoi rimuovere gli altri senza conoscerli. Ad esempio: 'while (Trace.Listeners.Count> 1) Trace.Listeners.RemoveAt (1);' – tedebus

10

Un'alternativa alla risposta di meilke che funziona con l'ultimo host di 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 è simile a DummyFactory ma utilizzando StreamWriter.Null invece di StringWriter:

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

Attenzione che esiste una condizione di competizione multi thread utilizzando 'StreamWriter.Null', poiché è anche usato da' Console.Write * 'quando non è collegata alcuna console, ad es. dai servizi di Windows. È preferibile utilizzare 'TextWriter.Synchronized (new StreamWriter (Stream.Null))'. –

Problemi correlati