我们正在使用Microsoft ServiceBus QueueClient向服务总线发送消息。在收到消息时,我们正在使用ServiceBus REST API。身体的反序列化失败了,我们无法找出根本原因。
发送消息的示例代码如下:
MessagingFactory messagingFactory =
MessagingFactory.CreateFromConnectionString(....);
Console.WriteLine("Creating Service Bus Queue Client...");
QueueClient queueSendClient = messagingFactory.CreateQueueClient(.);
// Send message M1 to the topic.
Console.WriteLine("Sending message.. ");
BrokeredMessage bm = CreateMessage();
queueSendClient.Send(bm);
CreateMessage实例化一个具有序列化对象实例的BrokeredMessage。
private static BrokeredMessage CreateMessage()
{
JObject o1 = JObject.Parse(File.ReadAllText(@"..\..\requestJson.json"));
string jsonMessage = JsonConvert.SerializeObject(o1);
CommandMessage commandMessage = new CommandMessage();
JsonCommand content = new JsonCommand("abc", "def", jsonMessage);
List<Command> list = new List<Command>();
list.Add(content);
commandMessage.Initialize(list, false, false);
var message = new BrokeredMessage(commandMessage);
return message;
}
注意:CommandMessage,JsonCommand,Command用[DataContract]修饰。
如果我们也使用QueueClient接收,那么消息的接收工作正常。但在我们的例子中,我们使用的是Service Bus Rest Client。
接收消息代码如下:
const string ServiceBusNamespace = "mysb2015-ns";
string baseAddressHttp = "https://" + ServiceBusNamespace + ".servicebus.windows.net/";
string queueAddress = baseAddressHttp + QueueName;
HttpResponseMessage response = await this.httpClient.PostAsync(address + "/messages/head?timeout=60", new ByteArrayContent(new Byte[0]));
byte[] body = response.Content.ReadAsByteArrayAsync().Result;
DataContractSerializer deserializer = new DataContractSerializer(typeof(CommandMessage));
using (MemoryStream ms = new MemoryStream(body))
{
CommandMessage cmdMsg = (CommandMessage)deserializer.ReadObject(ms);
}
读取对象失败,但根级别的数据无效:
System.Runtime.Serialization.SerializationException未处理 的HResult = -2146233076 Message =反序列化CommandMessage类型的对象时出错。根级别的数据无效。第1行,第1位。 源= System.Runtime.Serialization
我们查看了响应中的content-type标头,它是application / xml; utf-8。
答案 0 :(得分:1)
从给定的位置初始化BrokeredMessage类的新实例 通过使用DataContractSerializer与二进制文件对象 的的XmlDictionaryWriter 强>
当您将BrokeredMessage发送到队列时,XmlDictionaryWriter正在添加其类型指示。如果使用QueueClient进行接收,则没有问题。因为它可以解决这种类型的指示。但是,如果您使用的不是QueueClient,则会出现反序列化问题。
解决方案:
- 在反序列化之前删除指标。
- 使用BrokeredMessage的其他构造函数。
醇>BrokeredMessage(Stream messageBodyStream, bool ownsStream)
并控制邮件正文 自己。
在这个article中,他们解释了问题和解决方案。