【问题标题】:MSMQ .Net 2.0 Peek vs ReceiveMSMQ .Net 2.0 窥视与接收
【发布时间】:2015-02-18 21:17:55
【问题描述】:

在运行 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 方法的最后一条语句,它执行得很好。最奇怪的是,一旦 Receive 被执行一次,Peek 就会在之后的所有事情上工作。在最初执行 Peek 之前我需要做些什么特别的事情吗?

【问题讨论】:

  • 这不可能是你的实际代码,否则你会遗漏一些东西(比如怪异的扩展方法)。对于初学者,Something.Body 无法编译,因为Something 的类型为object,它没有Body 成员。
  • 你是对的。我试图减少代码并错过了它。我现在就修。
  • 所以你有一个带有 fekkedup 正文的消息。可能最好查看电线的另一端是否有问题。
  • @HansPassant 谢谢,但是如果 Body 无效,有什么方法可以在我的代码中判断?
  • 当然,你得到一个例外。如果在 Peek() 上发生这种情况,那么您将不止一次被提醒,不能错过。如果您更喜欢忽略真正糟糕的事情发生的方法,那么我怀疑我们可以帮助您。

标签: c# vb.net exception msmq peek


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 2012-04-22
    • 2012-08-12
    • 2011-08-11
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多