Azure Service Bus消息序列化/反序列化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Azure Service Bus消息序列化/反序列化相关的知识,希望对你有一定的参考价值。

我正在使用应用程序(.Net Core)通过Azure服务总线发送对象并通过Web作业(.Net Core)接收

问题是如何serialize/deserializesend/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);

测试结果:

enter image description here

以上是关于Azure Service Bus消息序列化/反序列化的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs &.net core connect Azure service bus

如何使用取消令牌Azure Service Bus(SubscriptionClient)

Azure Service Bus Queue 如何保证最多一次交付?

Javascript/nodejs Azure 服务总线完成一条消息

使用Service Bus Topic 实现简单的聊天室

queue service bus