2017-11-22 4 views
1

サービスバス上にメッセージを配置し、レガシー.NET 4.6受信者が読み取る必要のあるアプリケーションに.NET Core 2を使用しています。レシーバーは、他のレガシーアプリケーションからのメッセージもリスンします。Azureサービスバス - BrokeredMessage.GetBodyを使用して.NET Core 2から送信されたメッセージを読み取る

レガシー送信者:

UserData obj = new UserData() 
{ 
    id = 1, 
    name = "Alisha" 
}; 
BrokeredMessage message = new BrokeredMessage(consentInstated); 
_client.Send(message); 

レガシー受信機:

var dataObj = objBrokeredMessage.GetBody<UserData>(); 
businessFunc(dataObj.id, dataObj.name); 

.NETコア2差出人:https://stackoverflow.com/a/45069423/1773900

var ser = new System.Runtime.Serialization.DataContractSerializer(typeof(UserData)); 
var ms = new MemoryStream(); 
ser.WriteObject(ms, objUserData); 
var message = new Message(ms.ToArray()); 
_client.Send(message); 
に記載されるように

はしかし、レシーバはメッセージをデシリアライズに失敗し、次のエラーに

System.Runtime.Serialization.SerializationExceptionをスロー:タイプUserDataののオブジェクトをデシリアライズ にエラーが発生しました。入力ソースが正しくフォーマットされていない です。 ---> System.Xml.XmlException:入力 の入力が正しくフォーマットされていません。

両方の送信者を同じ受信者で使用できるようにするにはどうすればよいですか?

+0

が同じに見えるhttps://stackoverflow.com/a/45069423/122195 – thepirat000

+0

私はリンクで説明したのと同じ戦略を使用しました。 GetBody()はまだ解析エラーをスローします。 – lohiarahul

答えて

2

BrokeredMessageは、XMLバイナリリーダーを使用してメッセージをデシリアライズしています。だからあなたの送信部は次のようになります。

var ser = new DataContractSerializer(typeof(UserData)); 
var ms = new MemoryStream(); 
XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(ms); 
ser.WriteObject(binaryDictionaryWriter, obj); 
binaryDictionaryWriter.Flush(); 
var message = new Message(ms.ToArray()); 
+2

受信者はオブジェクトを解析できるようになりましたが、値が失われ、プロパティはすべてNULLに設定されます – lohiarahul

+0

データのシリアル化方法に問題があるようです。形成されるバイト配列は、BrokeredMessageが作成する配列とは異なります。 – lohiarahul

+1

@lohiarahul私はちょうどテストし、私のコードで新しいクライアントから古いクライアントの作品に送信します。あなたのメッセージの違いを特定できますか( 'Stream'を受け取り、' string'に変換して比較しますか?)例えば。メッセージクラスが異なる名前空間にある可能性がありますか? – Mikhail

1

を私たちは、.NETコア側から直接シリアル化JSONオブジェクトの文字列を送信することができ、そして我々は、.NET側でコードを次のようにメッセージを得ることができます。それは私の側で正しく動作します。

var dataObj = message.GetBody<UserData>(new DataContractJsonSerializer(typeof(UserData))); 

.NETコア側送信メッセージコード:

var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(objUserData)); 
_client.SendAsync(new Message{Body = body,ContentType = "text/plain"}).Wait(); 

.NET側メッセージコードを受信

var dataObj = message.GetBody<UserData>(new DataContractJsonSerializer(typeof(UserData))); 
関連する問題