Сериализация / десериализация сообщений 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);

Результат испытаний:

Другие вопросы по тегам