#wcf #enterprise-library #msmq
#wcf #enterprise-библиотека #msmq
Вопрос:
Справочная информация: Я использую WCF и MSMQ для выполнения длительных заданий на сервере. Протоколирование общих ошибок выполняется блоком приложений для ведения журнала Enterprise Library 5.
Моя проблема заключается в следующем: private LogWriter _writer = EnterpriseLibraryContainer.Текущий.getInstance() всегда равен нулю, как только ExecutingMethod() был извлечен из очереди и начинает выполняться, что приводит к невозможности протоколирования возможных ошибок.
public class SerializedClass
{
private LogWriter _writer = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
public void ExecutingMethod()
{
try
{
.....
}
catch(Exception ex)
{
_writer.Write(ex, Category.General, Priority.Highest);
}
}
}
Я уже проверил, что конфигурация ведения журнала видна исполняющей сборке. Я предполагаю, что может возникнуть проблема с сериализацией ‘SerializedClass’?
Любая помощь или ввод были бы оценены?
Ответ №1:
Класс LogWriter явно не сериализуем. Из кода не очевидно, какую сериализацию вы выполняете. На самом деле, это вообще не очевидно из кода, который вы сериализуете, поэтому я предполагаю здесь.
В любом случае, я не уверен, какой сериализатор вы используете, но что бы это ни было, LogWriter не будет проходить через это чисто. Сериализаторы .NET обычно не перезапускают конструкторы для типов, поэтому для полей, которые не десериализуются чисто, вы, вероятно, получите null, как и вы.
Обходной путь прост — не берите LogWriter, пока он вам действительно не понадобится. Извлеките его в блоке catch вместо сохранения в конструкторе. В этом случае, вероятно, будет проще использовать старые статические фасады вместо этого и просто вызвать Logger.Write() вместо того, чтобы проходить через конкретный экземпляр LogWriter.
-Крис