Message.GetBody ();序列化循环

本文关键字:序列化 循环 GetBody Message | 更新日期: 2023-09-27 18:19:15

我在序列化来自Windows Azure ServiceBus的消息时遇到问题。

当我调用"message.GetBody();"方法时,它会以某种循环结束,这使得我的azure模拟器分配了机器上所有可用的内存。

我代码:

            Microsoft.ServiceBus.Messaging.BrokeredMessage message;
            while (true)
            {
                // SB is an instance of a class which let me receive a BrokeredMessage through its ReceiveMessage method.
                message = SB.ReceiveMessage("orders");
                if (message == null)
                {
                    break;
                }

                // This ends up allocating lots of memory until the debugger crashes.
                Procurement.TestOrder torder = message.GetBody<Procurement.TestOrder>();
            }

使用的类:

[MessageContract(IsWrapped=false)]
public class TestOrder
{
    [MessageBodyMember]
    public int companyId { get; set; }
}

我也尝试使用[DataContract]和[DataMember]属性的TestOrder-Class。

顺便说一下,消息是一个非常简单的xml文件,没有任何名称空间,从BizTalk到azure的队列。

这可能有一些小缺陷,但我不认为序列化器有任何理由陷入循环。

提前感谢!

Message.GetBody ();序列化循环

使用[DataContract][DataMember]尝试反序列化时收到什么错误?如果你只做Stream s = message.GetBody<Stream>();, s包含什么?

如果字符串的有效载荷是text/XML,而不是二进制序列化的XML,则可能需要传入一个DataContractSerializer,如下所示:

torder = message.GetBody<TestOrder>(new DataContractSerializer(typeof(TestOrder)));

要进行快速测试,请尝试在message.GetBody之后添加Thread.Sleep(10)。我在使用本地Azure模拟器时遇到了类似的问题,这个简单的技巧解决了这个问题。