我正在使用MS模式和实践企业库MsmqTraceListener使用BinaryLogFormatter将条目记录到专用队列。
我现在想从队列中读取这些日志条目。在我查看message.Body之前,我需要设置MessageQueue的Formatter属性。我希望能够使用EnterpriseLibrary的BinaryLogFormatter,但我无法将其转换为IMessageFormatter。 (InvalidCastException的)
我错过了什么?
答案 0 :(得分:1)
你看过Enterprise Library Distributor Service了吗?它可能会开箱即用。实施的简短指南:Enterprise Library 5 Logging using MSMQ。
如果您不想使用完整的Distributor Service,请查看源代码以了解它们如何访问队列。它们似乎是直接使用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;
}
}
答案 1 :(得分:1)
确保要做的一件事是在设置messageQueue时包含以下内容。如果不是,那么去毛刺将不起作用。
((XmlMessageFormatter)messageQueue.Formatter).TargetTypeNames = new string[] { "System.String" };
一个腰下午试图把这个拿出来。