Azure Service Bus消息序列化/反序列化
Posted
tags:
篇首语:本文由小常识网(cha138.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)
{
}
可以使用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功能(服务总线队列触发器/ .NET标准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
如何序列化/反序列化以发送/接收对象?
请参考演示代码打击:
发信息:
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);
测试结果:
以上是关于Azure Service Bus消息序列化/反序列化的主要内容,如果未能解决你的问题,请参考以下文章
NodeJs &.net core connect Azure service bus
如何使用取消令牌Azure Service Bus(SubscriptionClient)
Azure Service Bus Queue 如何保证最多一次交付?