企业库Silverlight集成包日志应用程序块远程跟踪侦听器无法发送日志

时间:2011-12-05 08:28:12

标签: logging enterprise-library

当发生未处理的异常时,将在全局未处理的异常处理程序中弹出一个错误窗口,在此窗口中,有一个名为Restart的按钮,当单击此按钮时,我尝试将错误记录到远程跟踪侦听器远程服务器,并重新启动应用程序,但事实证明,当应用程序重新启动后,日志永远不会成功发送,我确保执行日志语句,但似乎日志不会发送到按钮click事件处理程序执行完成。

当我将发送日志拆分并重新启动到两个按钮时,它运行良好。

我也尝试将其中任何一个部分放在另一个线程中,但它仍然不起作用。

已经把头发拉了几天,有人可以救我吗?非常感谢...

1 个答案:

答案 0 :(得分:0)

使用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);