【发布时间】: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