Когда вы вызываете 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);