通过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
。
答案 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 等工具检查队列时,您会发现这种情况。