Корпоративная библиотека Silverlight Integration Pack Журнал приложения блокирует удаленный слушатель трассировки, не может отправить журнал - PullRequest
0 голосов
/ 05 декабря 2011

Когда происходит необработанное исключение, в глобальном обработчике необработанного исключения появляется окно ошибки, в этом окне есть кнопка «Перезапуск», при нажатии этой кнопки я пытался записать ошибку в удаленный прослушиватель трассировки. удаленного сервера и перезапустите приложение, но оказывается, что журнал никогда не отправляется успешно, после чего следует перезапуск приложения, я проверяю, выполняется ли инструкция log, но кажется, что журнал не отправляется, пока кнопка Выполнение обработчика события click завершено.

И когда я разделяю журнал отправки и перезагружаюсь на две кнопки, это работает хорошо.

Я также пытался поместить любую часть в другой поток, но она все еще не работает.

Потянув меня за волосы уже несколько дней, кто-нибудь может меня спасти? Большое спасибо ...

1 Ответ

0 голосов
/ 06 декабря 2011

Когда вы вызываете Write при использовании RemoteServiceTraceListener, 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);
...