Как получать сообщения, отформатированные с помощью BinaryLogFormatter

#logging #enterprise-library #msmq

#ведение журнала #корпоративная библиотека #msmq

Вопрос:

Я использую MS Patterns and Practices Enterprise Library MsmqTraceListener для регистрации записей в частной очереди с помощью BinaryLogFormatter.

Теперь я хотел бы прочитать эти записи журнала из очереди. Мне нужно установить свойство Formatter для MessageQueue, прежде чем я смогу просмотреть message.Body. Я ожидал, что смогу использовать BinaryLogFormatter из EnterpriseLibrary, но я не могу использовать это как IMessageFormatter. (Исключение InvalidCastException)

Чего я не понимаю?

Ответ №1:

Вы обращали внимание на службу распространения корпоративной библиотеки? Это может делать то, что вы хотите из коробки. Краткое руководство по внедрению: Ведение журнала Enterprise Library 5 с использованием MSMQ.

Если вы не хотите использовать полную службу распространения, посмотрите на исходный код, чтобы увидеть, как они получают доступ к очереди. Похоже, что они десериализуются с помощью BinaryLogFormatter напрямую. От MsmqLogDistributor.cs:

 using (MessageQueue msmq = CreateMessageQueue())
{
    Message message = msmq.Peek();

    string serializedEntry = message.Body.ToString();

    LogEntry logEntry = null;
    try
    {
        logEntry = BinaryLogFormatter.Deserialize(serializedEntry);
    }
    catch (FormatException formatException)
    {
        ...
    }
    catch (SerializationException serializationException)
    {
        ...
    }

    if (logEntry != null)
    {
        logWriter.Write(logEntry);
    }

    message = msmq.Receive();

    if (this.StopReceiving)
    {
        this.isCompleted = true;
        return;
    }
}
  

Ответ №2:

Одна вещь, которую нужно обязательно сделать, это включить следующее при настройке вашего MessageQueue. В противном случае десерилизация не будет работать.

 ((XmlMessageFormatter)messageQueue.Formatter).TargetTypeNames = new string[] { "System.String" };
  

Однажды днем я пытался разобраться в этом.