2013-07-30 14 views
16

私はMicrosoft.Owin.Hostingを使用して、次の非常に簡単なWebアプリケーションをホストしています。ここでOWINセルフホスティングのTraceListener

は、それを開始するための呼び出しです:ここでは

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

は、私が使用しています起動クラスである:

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

私は他の多くの事をしてコンソールアプリケーション内でこれを実行していますしかし、突然(OWINのホスティングを起動すると)、私はいつも別の場所にルーティングされているコンソールに書き込まれたトレースメッセージを見ています。

明らかに、OWINホスティングフレームワークでアクティブなトレースリスナーがいくつかあります。どうすればそれらを切ることができますか?

+0

私はので、私はトレースリスナーのみデバッグビルドで追加された推測と同じを見るが、リリースの構築時に消えているようです。 – osexpert

答えて

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; 
    } 
} 
15

私は同じ問題を抱えていました。私は自分自身で1つのプロセスで4つのインスタンスをホスティングしていましたが、リクエストごとに4つのメッセージがコンソールにトレースされていました。

単にのTraceListenerインスタンスに

Trace.Listeners.Remove("HostingTraceListener") 

を削除 "HostingTraceListenerが" owinソースコードで定義されている私は、私は 変更することができると思います - 私は

WebApp.Start(... 
+1

実際に私のために働いた解決策。 Microsoft.Owin.Hosting 2.0.2 – mortalapeman

+0

よくできました!それが私の問題の正しい解決策です! "HostingTraceListener"が変更された場合、内部のTrace.Listenersをループして削除するリスナーを探すことができます。通常、リスナー(デフォルトのリスナー)が1つしかない場合は、他のリスナーを知らなくても削除できます。次に例を示します。 'while(Trace.Listeners.Count> 1) Trace.Listeners.RemoveAt(1);' – tedebus

10

後にこれをしなかったhttp://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.Hosting/Engine/HostingEngine.cs

を最新の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に似ていますが、代わりにStringWriterのStreamWriter.Nullを使用して:

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

'StreamWriter.Null'を使ってマルチスレッドの競合状態が発生していることに注意してください。これはコンソールが接続されていないときに' Console.Write * 'でも使われるためです。 Windowsサービスから。代わりに 'TextWriter.Synchronized(新しいStreamWriter(Stream.Null))'を使用する方が良いでしょう。 –

関連する問題