如何从 BizTalk MSMQ 适配器发送的 C# 中的 MSMQ 专用队列接收 xml 消息
How to receive xml message from MSMQ private queue in C# sent by BizTalk MSMQ adapter
我使用 BizTalk 2016 并在 BizTalk MSMQ 适配器(主体类型 8209)中配置了默认设置。
我正在尝试从 C# 代码接收消息,但出现以下异常:
An unhandled exception of type 'System.InvalidOperationException'
occurred in System.Messaging.dll
Additional information: Cannot deserialize the message passed as an
argument. Cannot recognize the serialization format.
使用的代码(精简):
message = messageQueue.Receive();
message.Formatter = new ActiveXMessageFormatter();
document.Load(message.Body.ToString());
访问消息正文属性时抛出异常,触发格式化程序访问消息内容。
我尝试指定一个格式化程序,并尝试了几种不同的类型,但它们都不起作用。我担心数据上有一些字节顺序标记,需要手动删除。真的是这样吗?
我认为这种需求很普遍,卡在这个很奇怪...!?请让我在这方面走上正轨!
最终使用了 XmlDocument,它负责 BOM 和所有内容:
XmlDocument document = new XmlDocument();
document.Load(message.BodyStream);
这种情况下我不需要 MessageFormatter。 :)
不使用 XmlDocument 的替代解决方案。诀窍是使用 BodyStream 来避免任何格式化程序被初始化:
MessageQueue messageQueue = new MessageQueue(@".\private$\test");
System.Messaging.Message message = new System.Messaging.Message();
message.BodyType = 8209;
message = messageQueue.Receive();
using (FileStream fileStream = File.Create(@"C:\TEMP\output.xml"))
{
message.BodyStream.Seek(0, SeekOrigin.Begin);
message.BodyStream.CopyTo(fileStream);
}
此代码使用 UTF-8 和特殊字符作为 input/output。
我使用 BizTalk 2016 并在 BizTalk MSMQ 适配器(主体类型 8209)中配置了默认设置。
我正在尝试从 C# 代码接收消息,但出现以下异常:
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Messaging.dll
Additional information: Cannot deserialize the message passed as an argument. Cannot recognize the serialization format.
使用的代码(精简):
message = messageQueue.Receive();
message.Formatter = new ActiveXMessageFormatter();
document.Load(message.Body.ToString());
访问消息正文属性时抛出异常,触发格式化程序访问消息内容。
我尝试指定一个格式化程序,并尝试了几种不同的类型,但它们都不起作用。我担心数据上有一些字节顺序标记,需要手动删除。真的是这样吗?
我认为这种需求很普遍,卡在这个很奇怪...!?请让我在这方面走上正轨!
最终使用了 XmlDocument,它负责 BOM 和所有内容:
XmlDocument document = new XmlDocument();
document.Load(message.BodyStream);
这种情况下我不需要 MessageFormatter。 :)
不使用 XmlDocument 的替代解决方案。诀窍是使用 BodyStream 来避免任何格式化程序被初始化:
MessageQueue messageQueue = new MessageQueue(@".\private$\test");
System.Messaging.Message message = new System.Messaging.Message();
message.BodyType = 8209;
message = messageQueue.Receive();
using (FileStream fileStream = File.Create(@"C:\TEMP\output.xml"))
{
message.BodyStream.Seek(0, SeekOrigin.Begin);
message.BodyStream.CopyTo(fileStream);
}
此代码使用 UTF-8 和特殊字符作为 input/output。