2011-12-05 9 views
0

未処理の例外が発生すると、グローバルな未処理の例外ハンドラにエラーウィンドウがポップアップ表示されます。このウィンドウには、再起動というボタンがあります。このボタンをクリックして、リモートトレースリスナにリモートサーバへのエラーを記録しようとしましたが、アプリケーションを再起動しましたが、アプリケーションの再起動後にログが正常に送信されないことが判明しました。ログステートメントが実行されますが、ボタンのクリックイベントハンドラの実行が終了するまでログは送信されないようです。エンタープライズライブラリSilverlight統合パックロギングアプリケーションブロックリモートトレースリスナーがログを送信できない

送信ログを分割して2つのボタンに再起動すると、正常に動作します。

また、どちらかの部分を別のスレッドに配置しようとしましたが、それでも機能しません。

すでに数日間私の髪を引っ張って、誰でも私を救うことができますか?ありがとうございます。

+0

、あなたがhttp://entlib.codeplex.com/discussions/topics/4923/silverlight-integrationの下に質問を投稿したい場合がありますがEntLibエンジニアの専任のチームがあなたを助けることができる場所。 –

答えて

0

RemoteServiceTraceListenerを使用するときにWriteを呼び出すと、LogEntryはサーバーに送信されるリストに配置されます。頻繁にタイマーが実行され、リスト内の項目がサーバーに送信されます。 SendImmediatelyがTrueに設定されている場合でも、これが発生します。 SendImmediatelyをTrueに設定すると、タイマーコールバックは約1秒後に起動します。

したがって、再起動を実行すると、アプリケーションをサーバーに送信する前にアプリケーションを破棄している可能性があります。メッセージがIsolated Storageに保存され、再起動後にサーバーに返送されることを期待していましたが、それは起こっていないようです。

私はあなたが望むと思うように動作させることができましたが、ちょっと面倒です - おそらくもっと簡単な方法がありますか?

まず、LoggingServiceFactoryのインスタンスを作成し、コールバックを設定してアプリのURLに移動します。

public static class LogHelper 
{ 
    public static void Write(LogEntry logEntry) 
    { 
     // Factory is not configured so set config name 
     var factory = EnterpriseLibraryContainer.Current.GetInstance<LoggingServiceFactory>(); 
     factory.EndpointConfigurationName = "CustomBinding_ILoggingService"; 

     var proxy = factory.CreateChannel(); 

     proxy.Write(logEntry,() => 
     { 
      // Set callback Action 
      Deployment.Current.Dispatcher.BeginInvoke(() => 
      { 
       System.Windows.Browser.HtmlPage.Window.Navigate(
            new Uri("http://localhost/app.aspx")); 
      }); 
     }); 
    } 
} 

public static class ILoggingServiceExtension 
{ 
    public static void Write(this ILoggingService proxy, LogEntry logEntry, Action action) 
    { 
     LogEntryMessage[] messages = new LogEntryMessage[] { logEntry.ToLogEntryMessage() }; 

     proxy.BeginAdd(messages, r => 
      { 
       try 
       { 
        proxy.EndAdd(r); 
        if (action != null) 
         action(); 
       } 
       finally 
       { 
        if (proxy != null) 
        { 
         ((IDisposable)proxy).Dispose(); 
        } 
       } 
      }, null); 
    } 
} 

そしてLogHelperを介してメッセージを書く:

var logEntry = new LogEntry() { Message = "Test", Categories = { "default"} };    

LogHelper.Write(logEntry); 
関連する問題