C# Azure ServiceBus消息序列化/反序列化

C# Azure ServiceBus消息序列化/反序列化,c#,azure,.net-core,azureservicebus,azure-webjobs,C#,Azure,.net Core,Azureservicebus,Azure Webjobs,我正在使用.NET Core应用程序通过Azure服务总线队列发送对象,并让Web作业(.NET Core)接收该对象 我的问题是如何序列化/反序列化以发送/接收对象 我发现有很多引用传统的BroakerMessage.GetBody()来接收消息,但没有引用新的.NET核心方法。请告知,谢谢 发件人代码: using Microsoft.Azure.ServiceBus; MyClass object = new MyClass(); var message = new Message(ob

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

我的问题是如何序列化/反序列化以发送/接收对象

我发现有很多引用传统的
BroakerMessage.GetBody()
来接收消息,但没有引用新的.NET核心方法。请告知,谢谢

发件人代码:

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)
{
}
如何序列化/反序列化以发送/接收对象

请参阅演示代码:

发送消息:

var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(obj));
await  queueClient.SendAsync(new Message { Body = body, ContentType = "text/plain" });
在.net核心Web作业中

var body = Encoding.UTF8.GetString(message.Body);
var obj = JsonConvert.DeserializeObject<T>(body);
var body=Encoding.UTF8.GetString(message.body);
var obj=JsonConvert.DeserializeObject(主体);
测试结果:

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

可以使用JSON序列化来传输这些对象/实体

假设以下类是将向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函数(Service Bus Queue Trigger/.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));
}
[FunctionName(“ServiceBusQueueFunction”)]
公共静态无效运行([ServiceBusTrigger(“taskqueue”,Connection=“ServiceBusConnectionString”)]消息消息,TraceWriter日志)
{
Customer=JsonConvert.DeserializeObject(Encoding.UTF8.GetString(message.Body));
}
针对上述样本使用/测试了以下NuGet软件包:

  • Microsoft.Azure.ServiceBus(版本3.0.2)
  • Json(版本11.0.2)

考虑阅读:在下面找到JSON.NET的性能提示文章:


设计原理:最新的Microsoft.Azure.ServiceBus中删除了内置的POCO序列化支持。这是因为“虽然这种隐藏的序列化魔法很方便,但应用程序应该对对象序列化进行显式控制,并在将其对象图包含到消息之前将其转换为流,然后在接收方执行相反的操作。这将产生可互操作的结果。”


这两种方法对我都不起作用,因为:

当我们试图将消息体解析为JSON时,会遇到一个异常,因为我们正在接收的消息体是JSON

"@\u0006string\b3http://schemas.microsoft.com/2003/10/Serialization/?\u000b{ \"a\": \"1\"}"
这是因为“Brokered Message通过使用DataContractSerializer和二进制XmlDictionaryWriter从给定对象初始化BrokeredMessage类的新实例。”

参考:

所以我用了这篇博文:

示例1:使用字符串

使用字符串和默认(DataContract+二进制)序列化程序创建BrokeredMessage时:

BrokeredMessage stringDefaultMessage = new BrokeredMessage("default string");
您可以通过以下方式接收此消息:

string s = receiveMessage.GetBody<string>();
string s=receiveMessage.GetBody();

非常感谢你,你是救命恩人,我为此被困了几个小时。你真的测试过这个吗?反序列化对我不起作用,因为我的message.Body有一堆不是json的垃圾。这是我的消息创建代码:var queueBody=new queueBody{Name=$“JSmith{i}”;字符串messageBody=JsonConvert.SerializeObject(queueBody);var message=newmessage{Body=Encoding.UTF8.GetBytes(messageBody),ContentType=“application/json”};但是如果接收者不知道消息是
客户
,那么可以在哪里检索消息类型以动态决定反序列化到哪种类型?对我来说也不起作用。我得到@\fbase64Binary\b3http://schemas.microsoft.com/2003/10/Serialization/�\u0002\u0001{在接收文本的开头,此行失败:JsonConvert.DeserializeObject(正文);错误为“分析值时遇到意外字符:@”。在反序列化之前,是否有方法知道消息类型?