在运行Windows 2003 R2 SP 2的服务器上设置MSMQ。已安装.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方法的最终语句,它执行得很好。最奇怪的是,一旦接收执行一次,Peek将在此之后处理所有事情。在最初执行Peek之前,我需要做些什么特别的事情吗?
答案 0 :(得分:1)
当您从Message.Body
属性读取时,.Net将尝试反序列化它并创建对象。默认情况下,使用XMLMessageFormatter
执行对象反序列化。你得到的消息表明,身体原本是以其他方式序列化的,可能是使用BinaryMessageFormatter
或者根本不是从.Net发送的。
为了解决这个问题,你必须看一下发送方,检查那里使用的格式化程序,并将其配置为接收方式。另外,如果使用XMLMessageFormatter
,则必须在接收时设置其TargetTypes
或TargetTypeNames
属性。
消息也可能不是.Net序列化对象。在这种情况下,您可以使用BodyStream
属性逐字节直接访问正文,并以任何方式对其进行解码。
对于这个问题,您使用Peek还是Receive是完全无关紧要的。消息正文将以相同的方式处理。