2012-01-03 200 views
0

我有序列化来自Windows Azure ServiceBus消息的问题。Message.GetBody();序列化循环

当我调用“message.GetBody();”方法结束在某种循环,这使得我的天青模拟器分配机器上可用的所有内存。

我的代码:

  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; } 
} 

我一直在使用的TestOrder级的[DataContract]和[DataMember]标注属性也试过。

顺便说一句,该消息是一个非常简单的XML文件,没有任何命名空间从BizTalk进入Azure队列。

这可能会有一些小缺陷,但我没有看到序列化程序陷入循环的任何原因。

在此先感谢!

+0

当事情变得“在一个循环中卡住”它通常是从recorive呼吁例如,如果你不正确地访问属性成员..但从这个代码,你有..很难告诉发生了什么事.. – MethodMan 2012-01-03 15:14:40

+0

是啊,我也这么认为! 但是这段代码很简单。 即时只是试图序列化一个单一的元素,并确保该元素存在于XML中,它只包含数字1004. – DOOMDUDEMX 2012-01-03 15:26:27

回答

0

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

如果字符串的有效载荷为text/xml而非二进制序列化的XML,你可能需要在DataContractSerializer的传递是这样的:

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

s包含一个“Microsoft.ServiceBus.Messaging.BufferedInputStream”。 和负载我猜你的意思是消息的ContentType属性? ContentType是“application/soap + msbin1”。 – DOOMDUDEMX 2012-01-09 08:04:18

+0

对不起,因为迟到的答案,我从星期三起就离开了! – DOOMDUDEMX 2012-01-09 08:07:32

+0

忘记回答你的第一个问题... 我从来没有收到任何错误,问题是GetBody函数永远不会停止执行,只是填充内存。 (导致一个无关的错误消息,这意味着内存已满并且应用程序必须关闭) – DOOMDUDEMX 2012-01-09 12:19:28

0

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

+0

它没有什么区别。 顺便说一下,这将是一个代码的关键和平,所以我不想代码“只是工作”。 我想完全控制! 感谢您的回复! – DOOMDUDEMX 2012-01-03 15:56:16

+0

如果它如此重要,那么我建议你使用异步模式(更多性能)以及EntLib 5中的topaz构建模块,以便像这样对瞬态故障具有弹性:http://msdn.microsoft.com/en-us /library/hh680946(v=PandP.50).aspx,但使用ServiceBusTransientErrorDetectionStrategy。它完美的作品。 – 2012-01-03 16:05:50

+0

性能不是问题,我只是想确保代码在所有情况下都能正常工作。 (如果我不知道代码是如何编写的,我不是这样) – DOOMDUDEMX 2012-01-09 12:22:49