4

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 符号。

我找到了一些格式化服务总线消息内容的文章,但仍然找到了摆脱模式字符串的方法。

按照现在我正在substring处理消息正文。

4

3 回答 3

8

似乎您的发送者和接收者类型不匹配。ServiceBus BrokeredMessages 应该像这样使用:

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

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

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

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

于 2014-01-23T19:48:10.727 回答
4

这只是对@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;
}
于 2018-12-14T06:15:58.047 回答
0

你是什​​么类型的objMess.MessageBody?确保它与您在接收方轮询的类型相同,因为您正在执行GetBody<Stream>()

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

于 2014-08-01T12:06:21.673 回答