C#调用IBM MQ .NET XMS读取字节消息报长度错误如何解决
报错原因
你遇到的IBM.XMS.MessageEOFException异常核心原因是ReadUTF()方法的适用场景不匹配:ReadUTF()是JMS规范中专门用来读取对端用WriteUTF()方法写入的内容,该方法会默认先读取消息前2个字节作为字符串长度,再按该长度读取后续内容。如果你的消息发送端没有用WriteUTF()写入,就会出现读取长度和实际消息长度不符,触发读超界报错。
解决方案
C#版本的IBM XMS库中,对应Java getBodyLength()方法的是**IBytesMessage.BodyLength属性**,不是方法,你可以按以下逻辑改写代码:
var msg = (IBytesMessage)message; // 重置消息体读取指针到开头,避免之前的操作移动过指针 msg.Reset(); // 获取消息体总长度 int bodyLength = (int)msg.BodyLength; byte[] bodyBytes = new byte[bodyLength]; // 按长度读取全部字节 msg.ReadBytes(bodyBytes, bodyLength); // 直接转UTF8字符串,不需要额外转码 string plainText = System.Text.Encoding.UTF8.GetString(bodyBytes);
补充说明
- 不要用
ReadUTF()先读字符串再转字节,直接读取原始字节数组再转编码的逻辑更稳定,也能避免发送端编码不匹配导致的乱码问题 - 如果你确认发送端确实是用
WriteUTF()写入的消息,也可以直接调用ReadUTF()读取,不需要手动读字节,但是要保证发送端和接收端的写入、读取逻辑完全对齐。
内容的提问来源于stack exchange,提问作者Nirjal Khadka
相关产品推荐
相关产品推荐

