IBM MQ 服务器对消息进行编码

IBM MQ server encodes messages

我正在将 XML 发送到包含 CDATA 部分的 IBM MQ 队列。该 CDATA 部分包含这些特殊字符:$§)#ÜÖ&!^。由于某种原因,它们在 MQ 队列中显示为 $�)#��&!^。这会导致其他发送将其从包含这些字符的队列中删除,并最终导致签名无效,因为消息不再匹配。

我们已验证执行 .Put() 时的消息确实包含带有这些特殊字符的 XML 字符串。我已确保为该消息分配的 .CharacterSet 属性 与我们最终从队列中取出的内容相匹配。

还有哪些地方可以在放入队列时自动编码特殊字符?我们的应用程序在 .NET windows 环境中,但 MQ 服务器在 Linux 框上。这是要考虑的事情吗?

string xmlMsg = "<message><data><![CDATA[<value>$§)#ÜÖ&amp;!^</value>]]</data></message>"; // This is in a CDATA section.
mQMessage = new MQMessage
{
    CharacterSet = 1208,
};

mQMessage.WriteBytes(xmlMsg);

_queue.Put(mQMessage);

默认情况下,MQ 不会更改消息的字符集。因此默认情况下,发送和接收应用程序有责任同意并维护适合两者的字符集。

您可以在接收应用程序调用 get 时请求 MQ 进行字符集转换,或者在 queue 管理器之间传输消息时在发送方通道上进行字符集转换。但是,即使您从 MQ 请求字符集转换,发送应用程序仍然有责任使用应用程序在 MQ 消息上设置的字符集将数据实际写入消息 header.

根据您的代码,您的发送应用程序在将字节写入消息时似乎没有使用正确的字符集。如果使用 WriteBytes,则需要使用所需的字符集将字符串手动转换为字节。

我建议您使用 WriteString 方法,该方法旨在使用 CharacterSet 属性:

中指定的字符集

The WriteString method converts from Unicode to the character set encoded in CharacterSet. If CharacterSet is set to its default value, MQC.MQCCSI_Q_MGR, which is 0, no conversion takes place and CharacterSet is set to 1200. If you set CharacterSet to some other value, WriteString converts from Unicode to the alternate value.

https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.ref.dev.doc/q111220_.htm

顺便说一句,为了调试字符集问题,您必须非常小心使用什么工具来检查邮件,因为您的工具需要能够解释邮件的字符集。例如,MQ Explorer 使用您 运行 所在工作站的字符集,因此它将显示具有该字符集的每条消息,因此不适合调试这些问题。最好的办法是从 queue 中获取消息而不要求 QM 使用 rfhutil 进行转换,例如,将其保存到文件中并使用十六进制编辑器查看它。