Программно создать подписку на служебную шину с использованием стандарта.net

Мой сценарий: веб-сайт, размещенный в облаке, где каждый экземпляр создает подписку на тему шины обслуживания для себя, чтобы прослушивать сообщения.

Мой вопрос: как я программно создаю подписки?

...

Проблема: я привык использовать более старую библиотеку WindowsAzure. Теперь я использую.NET Standard, который не поддерживает старую библиотеку

Решение. Используйте пакет Microsoft.Azure.ServiceBus NuGet.

...

Проблема: он не поддерживает функции управления (например, создание подписки)

Решение. Также используйте библиотеку NuGet Microsoft.Azure.Management.ServiceBus

...

Проблема. Он не поддерживает использование строки подключения или ключей, предоставленных вам Azure Portal

Решение: https://github.com/Azure-Samples/service-bus-dotnet-management дает общую схему программирования.

...

Проблема: WTF - это {tenantId}, о котором он говорит?

Решение: Хорошо, что это найдено в разделе "Azure Active Directory" → "Свойства" и с осторожностью помечено как "Идентификатор каталога" вместо tenantId, как и следовало ожидать

...

Проблема: WTF - это {clientId} и {clientSecret}?

Решение: Еще проще. Из этой информации очевидно, что вы должны:

  1. Перейдите в "Azure Active Directory"
  2. Нажмите "Регистрация приложений"
  3. Нажмите "Создать новую регистрацию приложения"
  4. Назовите его, оставьте его как "Веб-приложение /API" и дайте ему знак по URL-адресу почти всего, что вы хотите, потому что это фактически не имеет значения, хотя оно обязательно
  5. Запишите "Идентификатор приложения", который, как всем известно, на самом деле означает {clientId}
  6. В новом приложении нажмите "Настройки",
  7. Нажмите "Ключи"
  8. Введите какое-то случайное описание в разделе "Пароли" и нажмите "Сохранить",
  9. Сохраните "Значение" там, потому что он тайно {clientSecret} (как умный! Cus it secret !!)
  10. Вернитесь в "Service Bus"
  11. Выберите "Контроль доступа (IAM)"
  12. Выберите роль, как Owner/Contributor
  13. Введите имя своего приложения и сохраните

...

Итак, работает ли первый шаг примера? AcquireTokenAsync возвращает токен доступа! YAYYYYYYYYYYYYY

result.AccessToken - это "токен", упомянутый на шаге 2, похоже.

Шаг 2, 3... нет проблем... на шаге 4. За исключением использования sbClient.Subscriptions.CreateOrUpdate вместо этого

{resourceGroupName} кажется достаточно простым - скопируйте с "Группы ресурсов" на портале

...

Проблема: что такое {namespaceName}?

Это имя сервисной шины? например {name}.servicebus.windows.net? Или это пространство имен, как {name.servicebus.windows.net}? Или он включает в себя схему типа {sb://name.servicebus.windows.net}??

...

Проблема. Независимо от того, что я здесь делаю, я заканчиваю тем, что "операция вернула недопустимый код состояния" NotFound "на вызове CreateOrUpdate.

И это, где я застрял. Где я ошибся?

И на сиднейте, snark отражает мое разочарование - мне действительно кажется, что мне нужно изучить большой стек технологии Azure, о котором я действительно не хочу ничего знать, просто для того, чтобы сделать что-то, что "должно быть простым" ". Как будто меня всасывают кроличью нору.

[РЕДАКТИРОВАТЬ №1] - "SubscriptionId" оказывается идентификатором подписки AZURE, найденным в разделе биллинга портала, не ссылаясь на подписку на служебную шину.

[EDIT # 2] - "namespaceName" не включает.servicebus.windows.net - просто само название

И с этими изменениями, после бесчисленных часов исследований, IT WORKS

Ответ 1

Первоначальный план для нового клиента Azure Service Bus вообще не включал плоскость управления и вместо этого использовал маршрут Azure Active Directory. Это оказалось слишком проблематично, как вы и указали. Команда Microsoft по обмену сообщениями собрала образец для демонстрации основных операций.

Обратите внимание, что есть ожидающий PR, чтобы заставить его работать с .NET Core 2.0

В дальнейшем было признано, что разработчики предпочитают получать доступ к Service Bass, используя строку подключения, как они использовали для опции Azure Active Directory. Проблема управления операциями поднимается для отслеживания запросов. В настоящее время планируется предоставить облегченную библиотеку управления для клиента .NET Standard.

На данный момент можно либо использовать старый клиент для создания сущностей, либо использовать Microsoft.Azure.Management.ServiceBus (или Fluent) до тех пор, пока пакет управления не станет доступен.

Обновить

Операции управления были выпущены как часть версии клиента 3.1.0.

Ответ 2

Microsoft.Azure.ServiceBus.3.1.0 позволяет создавать ManagementClient с помощью ConnectionString.

private async Task CreateTopicSubscriptions()
{
    var client = new ManagementClient(ServiceBusConnectionString);
    for (int i = 0; i < Subscriptions.Length; i++)
    {
        if (!await client.SubscriptionExistsAsync(TopicName, Subscriptions[i]))
        {
            await client.CreateSubscriptionAsync(new SubscriptionDescription(TopicName, Subscriptions[i]));
        }
    }
}