BrokeredMessage Deseralization带有不需要的String

时间:2013-11-09 05:55:44

标签: c# azureservicebus azure-worker-roles brokeredmessage

通过ServiceBus传递代理邮件,但没有任何自定义DataContractSerializer[as Default XML Serializer Take Place]

var message = new BrokeredMessage(objMess.MessageBody);

注意: 主要是邮件正文是HTML电子邮件的类型。

但是当在deserialization之后传递给工作人员角色的消息时,我看到顶部正文中附加了一些随机文本,

var reader = new StreamReader(receivedMessage.GetBody<Stream>());

@string3http://schemas.microsoft.com/2003/10/Serialization/�  .
Rest of Message Body 

我试图提供自定义DataContractSerializer。但这搞砸了HTML符号。

我发现了一些Formatting the content for Service Bus messages文章,但仍然找到了摆脱架构字符串的方法。

现在我正在使用邮件正文substring

3 个答案:

答案 0 :(得分:6)

好像你的发送方和接收方类型不匹配。 ServiceBus BrokeredMessages应该像这样使用:

1)如果你发送 var message = new BrokeredMessage(object) 你应该收到receivedMessage.GetBody<typeof(object)>()

2)如果你发送 var message = new BrokeredMessage(object, XmlObjectSerializer> - &gt; 你应该收到 receivedMessage.GetBody<typeof(object)>(XmlObjectSerializer)

3)如果你发送 var message = new BrokeredMessage(Stream) 你应该收到 receivedMessage.GetBody<Stream>

这对你来说应该是透明的。只需将您发送的类型放在Receiver中即可。 receivedMessage.GetBody<String>()如果是字符串或receivedMessage.GetBody<TypeOfMessageBody>()

答案 1 :(得分:1)

这只是@krolths answer的附加内容。

我遇到的情况是,我们以与OP相同的方式获取消息,并在我的单元测试中遇到了这个问题。问题的确是我们把一件事放进去,然后取出另一件事。我们正在传输JSON,因此放入字符串很自然。但是,为了使BrokeredMessage构造函数正确地对字符串进行序列化,我们必须将其包装在流中。这就是我们的方法。

private BrokeredMessage GetBrokeredMessageWithBody(object body)
{
    var json = JsonConvert.SerializeObject(body);
    return new BrokeredMessage(GenerateStreamFromString(json));
}

private Stream GenerateStreamFromString(string s)
{
    var stream = new MemoryStream();
    var writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}

答案 2 :(得分:0)

objMess.MessageBody的类型是什么?在进行GetBody<Stream>()

时,确保它与您在接收方进行轮询的类型相同

第一行由Service Bus完成,以序列化您的对象。当您使用 Service Bus Explorer 等工具检查队列时,您会发现这种情况。