Microsoft Service Bus REST客户端 - 从队列中读取的问题

时间:2016-03-03 11:36:59

标签: c# azure serialization azureservicebus azure-servicebus-queues

我们正在使用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。

1 个答案:

答案 0 :(得分:1)

  

从给定的位置初始化BrokeredMessage类的新实例   通过使用DataContractSerializer与二进制文件对象   的的XmlDictionaryWriter

当您将BrokeredMessage发送到队列时,XmlDictionaryWriter正在添加其类型指示。如果使用QueueClient进行接收,则没有问题。因为它可以解决这种类型的指示。但是,如果您使用的不是QueueClient,则会出现反序列化问题。

解决方案:

  
      
  1. 在反序列化之前删除指标。
  2.   
  3. 使用BrokeredMessage的其他构造函数。 BrokeredMessage(Stream messageBodyStream, bool ownsStream)并控制邮件正文   自己。
  4.   

在这个article中,他们解释了问题和解决方案。