1

Azure Service Bus トピックにサブスクライブしたときに受信したメッセージを解析しようとすると、シリアル化例外が発生します。私が欠けているものを見た人はいますか?Silverlight コードに Microsoft.ServiceBus.Samples.Messaging を使用しています。

次のコードを含む 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)
4

2 に答える 2

7

問題は SL コードではなく、送信者コードにあります。メッセージを送信するとき、既定の実装ではバイナリ メッセージ シリアライザーが使用されますが、SL 実装では XML 形式のメッセージに依存する DataContractSerializer が使用されます。この問題を解決するには、メッセージ送信で次のようなことを行う必要があります。

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

Service Bus では、ボディ コンテンツはほとんどバイトの袋です。送信者と受信者は、これらの内容がどのようにエンコード/デコードされるかについて合意する必要があります。

于 2013-05-01T01:42:26.590 に答える
1

文字列をシリアル化してバイトストリームとして送信し、受信側で文字列に逆シリアル化できます。それが動作します。

于 2013-05-01T05:05:53.337 に答える