尝试通过主题/订阅接收Azure Service总线消息时的序列化异常

时间:2013-04-29 16:10:30

标签: azure azureservicebus azure-sdk-.net azure-servicebus-queues

在尝试解析订阅Azure Service Bus主题时收到的消息时,我收到了序列化异常。有人看到我错过了吗?我正在使用Microsoft.ServiceBus.Samples.Messaging作为Silverlight代码。

我有一个带有以下代码的web服务:

public void PushCommand(Command command, int posLocationId)
{
    var topicName = "topicName";
    var topicClient = TopicClient.CreateFromConnectionString(ConnectionString, topicName);

    try
    {
         var message = new BrokeredMessage("test");
         topicClient.Send(message);
    }
    ...
}

我有一个SilverLightClient,代码如下:

private void OnReceiveMessageCompleted(IAsyncResult result)
{
     var subscriptionClient = (SubscriptionClient)result.AsyncState;
     try
     {
         var message = subscriptionClient.EndReceive(result);

         if (message != null)
         {
             String s = message.GetBody<string>();
         }

         // prep for next message
         subscriptionClient.BeginReceive(this.OnReceiveMessageCompleted, subscriptionClient);

     }
     catch (Exception e)
     {
        //unknown error
     }
}

发现了SerializationException 反序列化System.String类型的对象时出错。根级别的数据无效。第1行,第1位。

堆栈跟踪:

at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream stream)
at Microsoft.Samples.ServiceBus.Messaging.BrokeredMessage.GetBody[T]()
at Common.SubscriptionManager.OnReceiveMessageCompleted(IAsyncResult result)

2 个答案:

答案 0 :(得分:7)

问题不在您的SL代码中,而是在您的发件人代码中。发送消息时,默认实现使用二进制消息序列化程序,但SL实现使用DataContractSerializer,它依赖于XML格式的消息。要解决此问题,您的邮件发送需要执行以下操作:

DataContractSerializer ser = new DataContractSerializer(typeof(string));
queueClient.Send(new BrokeredMessage("test", ser));

在服务总线上,正文内容几乎是一大块字节 - 发送者和接收者需要就如何编码/解码这些内容达成一致。

答案 1 :(得分:1)

您可以序列化字符串并将其作为字节流发送,在接收端您可以反序列化为字符串。它会工作。