web-dev-qa-db-ja.com

Azure Service Busメッセージのシリアル化/逆シリアル化

アプリケーション(.Net Core)を使用して、Azureサービスバスを介してオブジェクトを送信し、Webジョブ(.Net Core)で受信しています

質問は、オブジェクトを_serialize/deserialize_から_send/receive_にする方法ですか?

メッセージを受信するためのレガシーBroakerMessage.GetBody()の参照がたくさん見つかりましたが、新しい.Net Coreメソッドではありません。アドバイスをお願いします、ありがとう。

送信者コード:

_using Microsoft.Azure.ServiceBus;

MyClass object = new MyClass();
var message = new Message(object);
await queueClient.SendAsync(message);
_

受信機コード:

_using Microsoft.Azure.ServiceBus;

public void ProcessQueueMessage([ServiceBusTrigger("queue")] Message message, TextWriter log)
{
}
_
9

JSONシリアル化を使用して、これらのオブジェクト/エンティティの転送を有効にすることができます。

次のクラスが、Azure Service Busキューとの間で送受信されるオブジェクトインスタンスのタイプであると想定します。

public class Customer{ public string Name { get; set; } public string Email { get; set; } }

---送信---

顧客オブジェクトインスタンスを送信するサンプルコード(.NET Core 2.0コンソールアプリケーション)を以下から検索します。

QueueClient queueClient = new QueueClient(connectionString, queueName);
string messageBody = JsonConvert.SerializeObject(obj);
Message message = new Message(Encoding.UTF8.GetBytes(messageBody))
{
    SessionId = sessionId
};
await queueClient.SendAsync(message);

---受信---

以下のAzure Function(Service Bus Queue Trigger/.NET Standard 2.0)サンプルコードを見つけて、メッセージを受信し、シリアル化を解除します。

[FunctionName("ServiceBusQueueFunction")]
public static void Run([ServiceBusTrigger("taskqueue", Connection = "ServiceBusConnectionString")] Message message, TraceWriter log)
{
    Customer customer = JsonConvert.DeserializeObject<Customer>(Encoding.UTF8.GetString(message.Body));
}

上記のサンプルでは、​​次のNuGetパッケージが使用/テストされました。

  • Microsoft.Azure.ServiceBus(バージョン3.0.2)。
  • Newtonsoft.Json(バージョン11.0.2)。

検討することを検討してください:JSON.NETのパフォーマンスのヒント記事を以下で見つけてください: https://www.newtonsoft.com/ json/help/html/Performance.htm


設計根拠:組み込みのPOCOシリアル化サポートは、最新のMicrosoft.Azure.ServiceBusで削除されました。これは、「この隠されたシリアル化マジックは便利ですが、アプリケーションはオブジェクトシリアル化を明示的に制御し、オブジェクトグラフをメッセージに含める前にストリームに変換し、受信側で逆に行う必要があります。これにより、相互運用可能な結果が得られます」

https://docs.Microsoft.com/en-us/Azure/service-bus-messaging/service-bus-messages-payloads

15
Evandro Paula

オブジェクトを送信/受信するためにシリアル化/逆シリアル化する方法は?

デモコードの詳細を参照してください。

メッセージを送信:

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

。netコアのWebJob

var body = Encoding.UTF8.GetString(message.Body);
var obj = JsonConvert.DeserializeObject<T>(body);

テスト結果:

enter image description here

0
Tom Sun - MSFT