通过c#在Websphere MQ中放置消息与手动放置相同消息的数据长度不同

本文关键字:消息 数据 Websphere MQ 通过 | 更新日期: 2023-09-27 18:05:10

MQMessage queueMessage = new MQMessage();
                queueMessage.WriteString(strInputMsg);
                queueMessage.Format = MQC.MQFMT_STRING;
                MQPutMessageOptions queuePutMessageOptions = new MQPutMessageOptions();
                Queue.Put(queueMessage, queuePutMessageOptions);

使用c#,使用上面的代码,当我将消息输入队列时,消息的数据长度为3600。

当我通过右键单击队列并选择Put Test message选项手动将消息输入队列时,消息的数据长度为1799。

我真的很困惑为什么会这样。这两种情况下的消息都是带有声明的xml字符串。在notepad++中,包括声明在内共有1811个字符。当我在输入队列之前在调试器中查看消息时,消息被转换为xml,没有任何行或回车符。

我创建了xml字符串使用:

//converts string message into xml by serializing it
 public string GetMessage(MyMessage messageInstance)
{
// Serialize the request
            XmlSerializer xsr = new XmlSerializer(typeof(MyMessage));
            MemoryStream memoryStream = new MemoryStream();
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
            xsr.Serialize(xmlTextWriter, messageInstance);
            memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
            string XmlizedString = new UTF8Encoding().GetString((memoryStream.ToArray());

            // Encode the xml
            Encoding utf = Encoding.UTF8;
            byte[] utfBytes = utf.GetBytes(XmlizedString);
            // Load the document (XmlResolver is set to null to ingore DTD)
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.XmlResolver = null;
            xmlDoc.LoadXml(utf.GetString(utfBytes));
            return utf.GetString(utfBytes);

我在c#实现中缺少任何添加额外字符的东西吗?

谢谢。

通过c#在Websphere MQ中放置消息与手动放置相同消息的数据长度不同

正如@Matten所建议的,一个问题可能是字符编码。

字符集属性的默认值是1200 (UNICODE), WriteString转换为字符集指定的代码页。

Code Page 1200是UTF-16小端编码,所以每个字符可能得到两个字节。"Put Test Message"当然有可能使用其他编码,对普通字符每个字符使用一个字节。

假设3600和1799长度以字节为单位计算,它们可以表示1800个UTF-16LE字符和1799个UTF-8字符(或1799个ASCII字符或1799个EBCDIC字符…)。

在长度上仍然有一个字符的差异。也许WriteString在写入的字符串中包含一个终止NULL字符?

你确定你相信notepad++给你的计数吗?如果Put Test Message在消息中放置了1799个字符,那么您提供给它的数据中可能有1799个字符。

Edit:假设编码理论是正确的,您可以通过使用不同的编码来缩短消息。一个编码能使一个特定的消息有多短取决于字符串的实际内容。

例如,您可以使用ASCII编码来获得每个字符一个字节。
MQMessage queueMessage = new MQMessage();
queueMessage.CharacterSet = 437;  // Set code page to ASCII

如果 xml字符串中的所有字符都有ASCII表示,那么将把您的消息缩短到1800字节

另一种选择是使用UTF-8编码。

MQMessage queueMessage = new MQMessage();
queueMessage.CharacterSet = 1208;  // Set code page to UTF-8

使用UTF-8的优点是(与ASCII不同)所有字符都有一个表示(对于'all'的某些值)。缺点是某些字符需要两个、三个甚至四个字节来表示它们。最常见的字符用一个字节编码,然后下一个最常见的字符用两个字节编码,依此类推。

在最好的情况下,UTF-8编码也会给你1800字节。在最坏的情况下,它会给你7200字节,但这似乎是不太可能的,除非你使用像克林贡语这样的语言!