Я отправляю сообщения в тему служебной шины 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?
из документации rest API вы можете отправить sessionid в качестве заголовка: Learn.microsoft.com/en-us/rest/api/servicebus/… необходимо отправить BrokerProperties
. В свойствах BrokerMessage есть поле sessionId: Learn.microsoft.com/en-us/dotnet/api/…
@AVijay, если SessionId включен, добавьте этот код client.DefaultRequestHeaders.Add("BrokerProperties", "{\"Label\":\"M1\",\"State\":\"Active\",\"TimeToLive\":10,\"SessionId\":\"Hello\"}");
Спасибо Томас за ваше предложение. Должен был быть ответ. Мне удалось успешно отправить сообщение, установив новое свойство заголовка с ключом BrokerProperties и значением «{«SessionId»: «{1234}»». Я тоже ценю ваш ответ, Паван.
Спасибо @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/…
Можете ли вы поделиться кодом, который вы пробовали?