簡體   English   中英

企業庫Silverlight Integration Pack日志記錄應用程序阻止遠程跟蹤偵聽器無法發送日志

[英]Enterprise Library Silverlight Integration Pack Logging app block remote trace listener can't send out log

當發生未處理的異常時,將在全局未處理的異常處理程序中彈出一個錯誤窗口,此窗口中有一個名為“重新啟動”的按鈕,單擊此按鈕后,我嘗試將錯誤記錄到遠程跟蹤偵聽器到遠程服務器,並重新啟動應用程序,但是事實證明,在重新啟動應用程序后,日志永遠不會成功發送出去,我確保執行了log語句,但是似乎直到按鈕單擊事件處理程序之后日志才被發送出去執行完成。

當我將發送日志拆分並重新啟動為兩個按鈕時,它運行良好。

我也嘗試將任一部分放在另一個線程中,但仍然無法正常工作。

已經拉了我幾天的頭發,有人可以救我嗎? 非常感謝...

當您使用RemoteServiceTraceListener調用Write時,LogEntry將放置在要發送到服務器的列表中。 計時器每隔一段時間運行一次,並將列表中的項目發送到服務器。 即使SendImmediately設置為True,也會發生這種情況。 如果將SendImmediately設置為True,則計時器回調將在大約1秒鍾后觸發。

因此,正在發生的事情是,當您執行重新啟動時,您正在關閉應用程序,然后才能將消息發送到服務器。 我曾希望將消息存儲在隔離存儲中,然后在重新啟動后發送回服務器,但這似乎沒有發生。

我能夠按照我認為的方式運行它,但是有點混亂-也許有一種更簡單的方法?

首先創建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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM