【问题标题】:Message.GetBody(); Serialization LoopMessage.GetBody();序列化循环
【发布时间】:2012-01-03 15:09:55
【问题描述】:

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

当我调用“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-Class 上使用 [DataContract] 和 [DataMember] 属性。

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

这可能存在一些小缺陷,但我看不出序列化程序陷入循环的任何原因。

提前致谢!

【问题讨论】:

  • 当事情“陷入循环”时,通常是由于递归调用,例如,如果您没有正确访问 Property 成员..但是从这段代码中你有..很难判断发生了什么..
  • 是的,我也这么认为!但是这段代码非常简单。我只是想序列化一个元素,我确定该元素存在于 xml 中,并且它只包含数字 1004。

标签: c# azure biztalk appfabric servicebus


【解决方案1】:

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

如果字符串的有效负载是文本/XML,而不是二进制序列化 XML,您可能需要像这样传递 DataContractSerializer:

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

【讨论】:

  • s 包含一个“Microsoft.ServiceBus.Messaging.BufferedInputStream”。通过有效负载,我猜您的意思是消息上的 ContentType 属性? ContentType 是“application/soap+msbin1”。
  • 对不起,顺便说一句迟到了,我从星期三就离开了!
  • 忘了回答你的第一个问题...我从来没有收到任何错误,问题是 GetBody 函数永远不会停止执行,只会填满内存。 (导致不相关的错误消息,仅表示 ram 已满,应用程序必须关闭)
  • 我的意思是,如果你调用 Stream.Read,byte[](s) 的内容是什么?
  • 读取缓冲区并在即时窗口中打印出 ascii 字符串表示给我这个:V\vs\vaV\bD?S?N????L??9\n?' ??@\nActivityId\rCorrelationId?$6440c44f-2e83-4914-a0c0-fc7dae88ca77\b=schemas.microsoft.com/2004/09/ServiceModel/…\r+drD\f\0??9sb://servicebusname.servicebus.windows.net/ordersV@Order@ \tcompanyId?1004@\aorderId?\a7172471@\fsuppliercode?\b11169315@\torderdate?\n2012-01-10@\vdesireddate?\n2011-06-16@\tordertext@name?companyname@street? (整个消息太长了,所以这是一个精简版)
【解决方案2】:

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

【讨论】:

  • 没什么区别。顺便说一句,这将是一个关键的代码和平,所以我不想要“正常工作”的代码。我想拥有完全的控制权!不过感谢您的回复!
  • 如果它如此重要,那么我建议您使用异步模式(更高性能)和 EntLib 5 中的黄玉构建块,以便能够像这里一样应对瞬态故障:msdn.microsoft.com/en-us/library/hh680946(v=PandP.50).aspx 但使用 ServiceBusTransientErrorDetectionStrategy .效果很好。
  • 性能不是问题,我只是想确保代码在所有情况下都能正常工作。 (如果我不知道我编写的代码是如何工作的,我不会)
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2014-04-30
  • 2015-08-26
相关资源
最近更新 更多