2012-01-03 44 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