web-dev-qa-db-fra.com

Sérialisation / désérialisation des messages Azure Service Bus

J'utilise une application (.Net Core) pour envoyer un objet via le bus de service Azure et reçu par un travail Web (.Net Core)

La question est de savoir comment serialize/deserialize Pour send/receive L'objet?

J'ai trouvé beaucoup de références pour l'héritage BroakerMessage.GetBody() pour recevoir le message, mais pas la nouvelle méthode .Net Core, merci de me conseiller.

Code expéditeur:

using Microsoft.Azure.ServiceBus;

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

Code récepteur:

using Microsoft.Azure.ServiceBus;

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

Il est possible d'utiliser la sérialisation JSON pour permettre le transfert de ces objets/entités.

Supposons que la classe suivante est le type des instances d'objet qui seront envoyées/reçues à partir d'une file d'attente Azure Service Bus:

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

--- Envoyer ---

Trouvez ci-dessous un exemple de code (application console .NET Core 2.0) pour envoyer une instance d'objet client:

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);

--- Recevoir ---

Trouvez ci-dessous un exemple de code Azure Function (Service Bus Queue Trigger/.NET Standard 2.0) pour recevoir le message et le désérialiser:

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

Les packages NuGet suivants ont été utilisés/testés pour les exemples ci-dessus:

  • Microsoft.Azure.ServiceBus (version 3.0.2).
  • Newtonsoft.Json (version 11.0.2).

Pensez à lire: Trouvez ci-dessous l'article sur les conseils de performance pour JSON.NET: https://www.newtonsoft.com/json/help /html/Performance.htm


Justification de la conception : la prise en charge de la sérialisation POCO intégrée a été supprimée dans la dernière version de Microsoft.Azure.ServiceBus. En effet, "bien que cette magie de sérialisation cachée soit pratique, les applications doivent prendre le contrôle explicite de la sérialisation des objets et transformer leurs graphiques d'objets en flux avant de les inclure dans un message, et faire l'inverse côté récepteur. Cela donne des résultats interopérables".

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

15
Evandro Paula

comment sérialiser/désérialiser pour envoyer/recevoir l'objet?

Veuillez vous référer au coup de code de démonstration:

Envoyer un message:

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

Dans le WebJob de base .net

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

Résultat du test:

enter image description here

0
Tom Sun - MSFT