Служебная шина Azure — REST API — отправка сообщения в тему/подписку с включенным сеансом

Я отправляю сообщения в тему служебной шины Azure с помощью REST API — https://learn.microsoft.com/en-us/rest/api/servicebus/send-message-to-queue.

Сообщения становятся недействительными по причине: «Объект с включенным сеансом не разрешает сообщение, идентификатор сеанса которого равен нулю». Поскольку в подписке включен сеанс, ожидается, что будет передан «sessionId». Я вижу, что SDK поддерживает отправку sessionId, но REST API — нет. Но мне нужно использовать REST API, и я не могу подключиться с помощью SDK, поскольку вызов выполняется из продаваемого продукта.

Есть мысли о том, как преодолеть эту проблему? Как можно передать идентификатор сеанса через API?

Можете ли вы поделиться кодом, который вы пробовали?

Pavan 29.08.2024 04:33

из документации rest API вы можете отправить sessionid в качестве заголовка: Learn.microsoft.com/en-us/rest/api/servicebus/… необходимо отправить BrokerProperties. В свойствах BrokerMessage есть поле sessionId: Learn.microsoft.com/en-us/dotnet/api/…

Thomas 29.08.2024 05:38

@AVijay, если SessionId включен, добавьте этот код client.DefaultRequestHeaders.Add("BrokerProperties", "{\"Label\":\"M1\",\"State\":\"Active\",\"TimeToLive\":10,\"‌​SessionId\":\"Hello\‌​"}");

Pavan 29.08.2024 09:53

Спасибо Томас за ваше предложение. Должен был быть ответ. Мне удалось успешно отправить сообщение, установив новое свойство заголовка с ключом BrokerProperties и значением «{«SessionId»: «{1234}»». Я тоже ценю ваш ответ, Паван.

AVijay 30.08.2024 12:29
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо @Thomas за ваш вклад, но упомянутое вами свойство SessionId является частью .NET SDK для Azure Service Bus, который доступен при работе в приложении .NET, ссылающемся на пространство имен Microsoft.ServiceBus.Messaging.

Это свойство позволяет вам установить идентификатор сеанса для сообщения при его отправке в очередь или тему с включенным сеансом с помощью SDK.

Однако, поскольку вы ограничены использованием REST API и не можете использовать SDK, вам нужно будет найти способ имитировать функциональность установки SessionId через REST API.

  • Лучше всего внедрить SessionId при отправке сообщений, внедрив небольшой прокси-сервер или используя функцию Azure или приложение логики.

consoleapp.cs с Rest API, используя SessionId:

using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
 
class Program
{
    static async Task Main(string[] args)
    {
        // Replace with your Service Bus details
        string serviceNamespace = "sampath";
        string queueName = "sampath";
        string sasToken = "";
        string messageBody = "This is a message.";
 
        // Create the HTTP client
        using (HttpClient client = new HttpClient())
        {
            // Set the request URI
            string requestUri = $"https://{serviceNamespace}.servicebus.windows.net/{queueName}/messages?timeout=60";
 
            // Create the message content with corrected content type
            StringContent content = new StringContent(messageBody, Encoding.UTF8, "application/xml");
 
            // Add required headers
            client.DefaultRequestHeaders.Add("Authorization", sasToken);
 
            // Adding the BrokerProperties header with SessionId
            client.DefaultRequestHeaders.Add("BrokerProperties", "{\"Label\":\"M1\",\"State\":\"Active\",\"TimeToLive\":10,\"SessionId\":\"Hello\"}");
 
            client.DefaultRequestHeaders.Add("Priority", "High");
            client.DefaultRequestHeaders.Add("Customer", "12345,ABC");
            client.DefaultRequestHeaders.ExpectContinue = true;
 
            
            HttpResponseMessage response = await client.PostAsync(requestUri, content);
 
            // Check the response
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine($"Message sent successfully with status code: {response.StatusCode}");
            }
            else
            {
                Console.WriteLine($"Failed to send message. Status code: {response.StatusCode}, Reason: {response.ReasonPhrase}");
            }
        }
    }
}

Сообщение отправлено:

Выход:

Просто добавляю сюда комментарий для тех, кто сталкивается с той же проблемой. Действительно возможно отправить идентификатор сеанса в вызове REST API. Документация для этого находится здесь — Learn.microsoft.com/en-us/rest/api/servicebus/…

AVijay 30.08.2024 12:30

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

Стандарт приложения логики: проблемы с сеансом служебной шины
Как правильно зарегистрировать и запустить процессор служебной шины Azure в службе приложений Azure
Скрипты для уведомления об очереди недоставленных писем
Время ожидания метода SendBatchAsync служебной шины Azure в устаревшем веб-API
Развертывание отфильтрованных метрик на информационной панели Azure с помощью Bicep
Группы очередей служебной шины Azure
Получение сообщения с помощью Azure.Messaging.ServiceBus, отправленного с помощью Microsoft.ServiceBus.Messaging (ServiceBus.v1_1)
Служебная шина Azure — ServiceBusProcessorClient-Java — Trytimeout и обработка одновременных сеансов
Как решить проблему «ManagedIdentityCredential.GetToken не удалось получить токен доступа». при использовании Azure ServiceBusTrigger и управляемого удостоверения?
Невозможно распечатать/использовать выходные данные сообщения служебной шины Azure, хранящиеся как System.Collections.Hashtable