0

MSMQ 安装在运行 Windows 2003 R2 SP 2 的服务器上。安装了 .Net 2.0。发送到此队列的所有消息都应该是 QMsg 类型。无论如何,Peek 返回一个 System.Messaging.Message 类型的对象,但 Body 出错,并出现异常,表明 Root 缺失。我已经在“This”定义处设置了断点,并且可以查看“Something”实例。

Body = {“无法反序列化作为参数传递的消息。无法识别序列化格式。”}

public QMsg GetCommand()
{
    Message Something = mqCompany.Peek();
    string This = Something.Body.GetType.ToString.ToLower;
    //. . . Code to check the type of Body
    return (QMsg)mqCompany.Receive().Body;
}

Private Function GetCommand() as QMsg
    Dim Something as Message = mqCompany.Peek()
    Dim This as string = Something.Body.GetType.ToString.ToLower
    . . . Code to check the type of Body
    GetCommand = CType(mqCompany.Receive().Body, QMsg)
End Function

如果我允许执行“This”语句,它会引发异常。但是,如果我跳到包含 Receive 方法的最后一条语句,它执行得很好。最奇怪的是,一旦 Receive 被执行一次,Peek 就会在之后的所有事情上工作。在最初执行 Peek 之前我需要做一些特别的事情吗?

4

1 回答 1

1

当您从Message.Body属性中读取时,.Net 将尝试反序列化它并创建对象。默认情况下,对象反序列化使用XMLMessageFormatter. 您收到的消息表明 body 最初是以其他方式序列化的,可能使用BinaryMessageFormatter或根本不从 .Net 发送。

为了解决这个问题,您必须查看发送方,检查那里使用的格式化程序并将其配置为接收相同。另外,如果XMLMessageFormatter使用了,必须在接收时设置它的TargetTypesorTargetTypeNames属性。

消息也可能根本不是 .Net 序列化对象。在这种情况下,您可以使用BodyStream属性直接逐字节访问正文并以任何您必须的方式对其进行解码。

对于这个问题,您使用 Peek 还是 Receive 完全无关紧要。消息正文将以相同的方式处理。

于 2015-03-02T21:22:21.560 回答