2013-07-30 9 views
16

Ich verwende Microsoft.Owin.Hosting, um die folgende, sehr einfache Web-App zu hosten.TraceListener in OWIN Self-Hosting

Hier ist der Aufruf zu starten:

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

Hier ist die Startklasse verwende ich:

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

ich diese in einer Konsolenanwendung leite, die eine Menge anderer Dinge tut einschließlich Routing-Trace-Schreiben in bestimmte Dateien usw. Aber plötzlich (beim Aktivieren des OWIN-Hostings) sehe ich Trace-Nachrichten, die an die Konsole geschrieben werden, die normalerweise woanders geroutet werden.

Offensichtlich sind einige Trace-Listener im OWIN-Hosting-Framework aktiv. Wie kann ich sie ausschalten?

+0

ich das gleiche zu sehen, aber wenn in Freigabe Gebäude zu verschwinden scheint also denke ich, die Trace-Listener nur in Debug hinzugefügt wird, baut . – osexpert

Antwort

1

Ich habe selbst eine Lösung gefunden. Nach dem Studium des Katana-Quellcodes scheint es so, als ob Sie Ihre eigene ITraceOutputFactory -Instanz registrieren müssen, um den Standard-Trace-Listener (der auf die Konsole schreibt) zu übersteuern. Hier

ist der neue Startaufruf:

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

Und hier ist eine Dummy-Spur Fabrik (vielleicht nicht die beste Lösung, aber man kann es ersetzen mit etwas Ihrem Zweck ein wenig besser Portion):

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

Ich hatte das gleiche Problem, ich war selbst hosting 4 Instanzen in einem Prozess und für jede Anfrage wurde 4 viele Nachrichten zur Konsole verfolgt.

Ich habe einfach Tracelistener-Instanz

Trace.Listeners.Remove("HostingTraceListener") 

"HostingTraceListener" in der owin Quellcode definiert also denke ich, ändern könnte - http://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Hosting/Engine/HostingEngine.cs

ich diese nach

WebApp.Start(... 
+1

Einzige Lösung, die tatsächlich für mich funktionierte. Microsoft.Owin.Hosting 2.0.2 – mortalapeman

+0

Gut gemacht! Das ist die richtige Lösung für mein Problem! Wenn sich "HostingTraceListener" ändert, können Sie Insider Trace.Listeners loopen und nach dem zu entfernenden Listener suchen. Wenn Sie normalerweise nur einen Listener haben (den Standard), können Sie die anderen entfernen, ohne sie zu kennen. Beispiel: 'while (Trace.Listeners.Count> 1) Trace.Listeners.RemoveAt (1);' – tedebus

10

tat Eine Alternative zu der Antwort von meilke, die mit dem neuesten Katana-Self-Host (2.1.0) arbeitet:

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 ist ähnlich DummyFactory aber StreamWriter.Null statt String mit:

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

Beachten Sie, dass es eine Multi-Thread-Race-Bedingung gibt, die 'StreamWriter.Null' verwendet, da sie auch von' Console.Write * 'verwendet wird, wenn keine Konsole angeschlossen ist, z. von Windows-Diensten. Es ist besser, 'TextWriter.Synchronized (new StreamWriter (Stream.Null))' stattdessen zu verwenden. –