Сериализация / десериализация сообщений Azure ServiceBus
Я использую приложение (.Net Core) для отправки объекта через служебную шину Azure и получения веб-задания (.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)
{
}
2 ответа
Можно использовать сериализацию 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 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
Ни один из них не помог мне, потому что:
Мы получаем исключение, когда пытаемся проанализировать тело сообщения как JSON, потому что тело сообщения, которое мы получаем, является
"@\u0006string\b3http://schemas.microsoft.com/2003/10/Serialization/?\u000b{ \"a\": \"1\"}"
Это связано с тем, что "Brokered Message инициализирует новый экземпляр класса BrokeredMessage из заданного объекта с помощью DataContractSerializer с двоичным XmlDictionaryWriter".
Ссылка: https://www.bfcamara.com/post/84113031238/send-a-message-to-an-azure-service-bus-queue-with
Поэтому вместо этого я использовал это сообщение в блоге: https://abhishekrlal.com/2012/03/30/formatting-the-content-for-service-bus-messages/
Пример 1: Использование строки
При создании BrokeredMessage со строкой и сериализатором по умолчанию (DataContract + Binary):
BrokeredMessage stringDefaultMessage = new BrokeredMessage("default string");
Вы можете получить это сообщение как:
string s = receiveMessage.GetBody<string>();
как сериализовать / десериализовать, чтобы отправить / получить объект?
Пожалуйста, обратитесь к демонстрационному коду удара:
Отправить сообщение:
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);
Результат испытаний: