如何从 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。