I am using application(.Net Core) to send an object through azure service bus and received by a web job(.Net Core)
Question is how to serialize/deserialize
to send/receive
the object?
I found lots of reference for the legacy BroakerMessage.GetBody()
to receive message, but not the new .Net Core method, please advice, thanks.
Sender code:
using Microsoft.Azure.ServiceBus;
MyClass object = new MyClass();
var message = new Message(object);
await queueClient.SendAsync(message);
Receiver code:
using Microsoft.Azure.ServiceBus;
public void ProcessQueueMessage([ServiceBusTrigger("queue")] Message message, TextWriter log)
{
}
It is possible to use JSON serialization to enable transferring these objects/entities.
Assume the following class is the type of which object instances will be sent to/received from an Azure Service Bus queue:
public class Customer{ public string Name { get; set; } public string Email { get; set; } }
--- Send ---
Find below a sample code (.NET Core 2.0 Console Application) to send a customer object instance:
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);
--- Receive ---
Find below an Azure Function (Service Bus Queue Trigger/.NET Standard 2.0) sample code to receive the message and deserialize it:
[FunctionName("ServiceBusQueueFunction")]
public static void Run([ServiceBusTrigger("taskqueue", Connection = "ServiceBusConnectionString")] Message message, TraceWriter log)
{
Customer customer = JsonConvert.DeserializeObject<Customer>(Encoding.UTF8.GetString(message.Body));
}
The following NuGet packages were used/tested for the samples above:
- Microsoft.Azure.ServiceBus (version 3.0.2).
- Newtonsoft.Json (version 11.0.2).
Consider Reading: Find below the performance tips article for the JSON.NET: https://www.newtonsoft.com/json/help/html/Performance.htm
Design rationale: Built in POCO serialization support was removed in the latest Microsoft.Azure.ServiceBus. This was because "while this hidden serialization magic is convenient, applications should take explicit control of object serialization and turn their object graphs into streams before including them into a message, and do the reverse on the receiver side. This yields interoperable results."
https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messages-payloads
how to serialize/deserialize to send/receive the object?
Please refer to the demo code blow:
Send message:
var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(obj));
await queueClient.SendAsync(new Message { Body = body, ContentType = "text/plain" });
In the .net core WebJob
var body = Encoding.UTF8.GetString(message.Body);
var obj = JsonConvert.DeserializeObject<T>(body);
Test Result:
I also ran into this requirement, and made a simple serialization/deserialization library to wrap this functionality up. You can find it here, it might help with implementation for anyone else running into this.
来源:https://stackoverflow.com/questions/50710568/azure-servicebus-message-serialization-deserialization