我正在使用 .NET Core 应用程序通过 Azure 服务总线队列发送对象,并由 Web 作业(也包括 .NET Core)接收该对象。
我的问题是如何序列化/反序列化以发送/接收对象?
我发现很多对旧版 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 服务总线队列或从 Azure 服务总线队列接收对象实例的类型:
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(服务总线队列触发器/.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://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messages-payloads
关于c# - Azure ServiceBus 消息序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50710568/