MSMQ .Net 2.0 查看与接收

MSMQ .Net 2.0 Peek vs Receive

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

Body = {"Cannot deserialize the message passed as an argument. Cannot recognize the serialization format."}

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

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

为了解决这个问题,你必须看看发送方,检查那里使用的是哪个格式器,并为接收配置相同的格式器。另外,如果使用XMLMessageFormatter,接收时必须设置其TargetTypesTargetTypeNames属性。

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

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