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
,接收时必须设置其TargetTypes
或TargetTypeNames
属性。
也有可能消息根本不是 .Net 序列化对象。在这种情况下,您可以使用 BodyStream
属性 逐字节直接访问正文并以您必须的任何方式对其进行解码。
对于这个问题,使用 Peek 还是 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
,接收时必须设置其TargetTypes
或TargetTypeNames
属性。
也有可能消息根本不是 .Net 序列化对象。在这种情况下,您可以使用 BodyStream
属性 逐字节直接访问正文并以您必须的任何方式对其进行解码。
对于这个问题,使用 Peek 还是 Receive 完全无关。消息正文将以相同的方式处理。