MSMQ .Net 2.0 Peek vs Receive

时间:2015-02-18 21:17:56

标签: c# vb.net exception msmq peek

在运行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之前,我需要做些什么特别的事情吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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