Azure Service Bus - темы, сообщения - с использованием .NET Core
Я пытаюсь использовать Azure Service Bus с .NET Core. Очевидно, на данный момент это отстой. Я пробовал следующие маршруты:
- Официальный SDK: не работает с .NET Core
- AMQP.Net Lite: нет (достойная) документация, нет API-интерфейсов управления вокруг создания/публикации и т.д. Только примеры служебной шины охватывают небольшой набор функциональных возможностей, и вам нужно иметь уже тему, и т.д.
- Обертка сообщества вокруг AMQP.Net Lite, которая отражает Azure SDK (https://github.com/ppatierno/azuresblite): не работает с .NET Core
Затем я перешел к REST.
https://azure.microsoft.com/en-gb/documentation/articles/service-bus-brokered-tutorial-rest/ - это хороший старт (хотя поддержка сторонних разработчиков для .NET Core тоже не поддерживается, и по какой-то причине официальный SDK, похоже, не охватывает REST клиент - нет Swagger def, нет клиента AutoRest и т.д.). Хотя этот дрянной пример объединяет строки в XML без кодирования и охватывает небольшой набор функциональных возможностей.
Поэтому я решил искать документацию REST. Есть два раздела: "классический" REST и просто REST. Обычный старый REST не поддерживает отправку и получение сообщений (кажется, да?). Я ненавижу использовать более старую технологию с надписью "классика", если я не могу понять, что это такое - конечно, документы здесь не помогают. Он также использует XML и ATOM, а не JSON. Я понятия не имею, почему.
Бонус: образец, связанный в документации для REST API, например. от https://msdn.microsoft.com/en-US/library/azure/hh780786.aspx, больше не существует.
Существуют ли какие-либо жизнеспособные подходы, которые кому-либо удалось использовать для чтения/записи сообщений по темам/из подписки с Azure Service Bus и .NET Core?
Ответы
Ответ 1
Тем не менее нет достаточной поддержки для реализации OnMessage
, которая, я думаю, самая важная вещь в ServiceBus,.Net Core версии ServiceBus был выпущен несколько дней назад.
Ответ 2
К сожалению, на момент написания этой статьи ваши единственные варианты использования служебной шины - либо бросить свой собственный, если вы хотите использовать Azure Storage, либо альтернативную стороннюю библиотеку, такую как Hangfire, которая имеет своего рода -queue в виде хранилища серверов Sql.
Ответ 3
Поддержка Azure Service Bus в .Net Core становится все лучше и лучше. Для него есть специальный пакет nuget: Microsoft.Azure.ServiceBus. На данный момент (март 2018 года) он поддерживает большинство сценариев, которые могут вам понадобиться, хотя есть некоторые пробелы, например:
- прием сообщений в пакетах
- проверка наличия темы/очереди/подписки
- создание новой темы/очереди/подписки из кода
Что касается поддержки OnMessage для приема сообщений, появляется новый метод: RegisterMessageHandler, который делает то же самое.
Вот пример кода, как его можно использовать:
public class MessageReceiver
{
private const string ServiceBusConnectionString = "Endpoint=sb://bialecki.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=[privateKey]";
public void Receive()
{
var subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, "productRatingUpdates", "sampleSubscription");
try
{
subscriptionClient.RegisterMessageHandler(
async (message, token) =>
{
var messageJson = Encoding.UTF8.GetString(message.Body);
var updateMessage = JsonConvert.DeserializeObject<ProductRatingUpdateMessage>(messageJson);
Console.WriteLine($"Received message with productId: {updateMessage.ProductId}");
await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
},
new MessageHandlerOptions(async args => Console.WriteLine(args.Exception))
{ MaxConcurrentCalls = 1, AutoComplete = false });
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
}
}
}
Полную информацию смотрите в моих сообщениях в блоге:
Отправка сообщений в .Net Core: http://www.michalbialecki.com/2017/12/21/sending-a-azure-service-bus-message-in-asp-net-core/
Получение сообщений в .Net Core: http://www.michalbialecki.com/2018/02/28/receiving-messages-azure-service-bus-net-core/