Краткое руководство: Отправка и получение сообщений из очереди Azure Service Bus (.NET)

В этом кратком руководстве вы выполните следующие шаги:

  1. Создание пространства имен служебной шины с помощью портала Azure.

  2. Создание очереди служебной шины с помощью портала Azure.

  3. Напишите консольное приложение .NET для отправки набора сообщений в очередь.

  4. Напишите консольное приложение .NET для получения этих сообщений из очереди.

    В этом кратком руководстве приведены пошаговые инструкции по реализации простого сценария отправки пакета сообщений в очередь Service Bus, а затем их получения. Общие сведения о клиентской библиотеке Служебной шины Azure для .NET см. в этой статье. Для получения дополнительных примеров см. Service Bus .NET samples на GitHub.

Предварительные условия

Если вы впервые используете эту службу, ознакомьтесь с обзором Service Bus, прежде чем приступить к этому краткому руководству.

  • Подписка Azure. Чтобы использовать службы Azure, включая Служебную шину Azure, вам потребуется подписка. Если у вас нет существующей учетной записи Azure, вы можете зарегистрироваться и получить бесплатную пробную версию.
  • Visual Studio 2022 или более поздней версии. Пример приложения использует новые функции, представленные в C# 10. Вы все еще можете использовать библиотеку клиента Service Bus с предыдущими версиями языка C#, но синтаксис может отличаться. Чтобы использовать последний синтаксис, рекомендуется установить .NET 6.0 или более позднюю версию и установить версию языка на latest. Если вы используете Visual Studio, версии до Visual Studio 2022 несовместимы с инструментами, необходимыми для сборки проектов C# 10.

Создание пространства имен на портале Azure

Чтобы начать использование сущностей обмена сообщениями служебной шины в Azure, создайте пространство имен с уникальным именем в Azure. Пространство имен предоставляет контейнер области для ресурсов Service Bus, таких как очереди и темы в вашем приложении.

Чтобы создать пространство имен:

  1. Войдите на портал Azure.

  2. Выберите всплывающее меню в левом верхнем углу и перейдите на страницу "Все службы".

  3. На панели навигации слева выберите "Интеграция".

  4. Прокрутите вниз до служб обмена сообщениями, наведите указатель мыши на служебную шину и нажмите кнопку "Создать".

    Снимок экрана: выбор ресурса, интеграции и служебной шины в меню.

  5. На вкладке "Основы" страницы"Создание пространства имен " выполните следующие действия:

    1. Выберите подписку Azure, в которой будет создано пространство имен.

    2. Для группы ресурсов выберите существующую группу ресурсов или создайте новую.

    3. Введите название пространства имён, соответствующее следующим соглашениям об именовании:

      • Это имя должно быть уникальным в пределах Azure. Система немедленно проверяет, доступно ли имя.
      • Длина имени составляет не менее 6 и не более 50 символов.
      • Имя может содержать только буквы, цифры и дефисы -.
      • Имя должно начинаться с буквы и заканчиваться буквой или цифрой.
      • Имя не заканчивается на -sb или -mgmt.
    4. Для расположения выберите регион для размещения пространства имен.

    5. Для параметра Ценовая категория выберите ценовую категорию ("Базовый", "Стандартный" или "Премиум") для пространства имен. Для работы с этим кратким руководством выберите вариант Стандартный.

      Если выбрать уровень "Премиум" , можно включить георепликацию для пространства имен. Функция георепликации гарантирует, что метаданные и данные пространства имен постоянно реплицируются из основного региона в один или несколько дополнительных регионов.

      Внимание

      Чтобы использовать разделы и подписки, выберите категорию "Стандартный" или "Премиум". Ценовая категория "Базовый" не поддерживает разделы и подписки.

      Если выбрана ценовая категория Премиум, укажите число единиц обмена сообщениями. В категории "Премиум" обеспечивается изоляция ресурсов на уровне ЦП и памяти, так что рабочая нагрузка выполняется изолированно от других. Этот контейнер ресурсов называется как единица обмена сообщениями. Пространству имен ценовой категории "Премиум" выделяется по крайней мере одна единица обмена сообщениями. Вы можете выбрать 1, 2, 4, 8 или 16 единиц обмена сообщениями для каждого пространства имен служебной шины Premium. Дополнительные сведения см. в разделе Премиум-уровень обмена сообщениями в служебной шине.

    6. Нажмите Review + create внизу страницы.

      Снимок экрана: страница

    7. На странице "Просмотр и создание " просмотрите параметры и нажмите кнопку "Создать".

  6. После успешного развертывания ресурса выберите "Перейти к ресурсу " на странице развертывания.

    Снимок экрана: страница успешного развертывания с ссылкой

  7. Вы увидите главную страницу пространства имен служебной шины.

    Снимок экрана: домашняя страница созданного пространства имен служебной шины.

Создание очереди на портале Azure

  1. На странице пространства имен служебная шина разверните сущности в меню навигации слева и выберите "Очереди".

  2. На странице Очереди, на панели инструментов выберите + Очередь.

  3. Введите имя очереди. Оставьте другие значения своими значениями по умолчанию.

  4. Нажмите кнопку "Создать".

    Снимок экрана: страница создания очереди.

Внимание

Если вы не знакомы с Azure, вы можете найти вариант строки подключения проще для понимания. Перейдите на вкладку "Строка подключения" , чтобы просмотреть инструкции по использованию строки подключения в этом кратком руководстве. Рекомендуем использовать вариант входа без пароля в реальных сценариях и продуктивных средах.

Проверка подлинности приложения в Azure

В этой статье показаны два способа подключения к шине обслуживания Azure: без пароля и строка подключения.

Первый вариант показывает, как использовать учетные данные безопасности в Microsoft Entra ID и ролевое управление доступом (RBAC) для подключения к пространству имен Service Bus. Вам не нужно беспокоиться о жёстко закодированной строке подключения в вашем коде, в файле конфигурации или в безопасном хранилище, таком как Azure Key Vault.

Второй вариант показывает, как использовать строку подключения для подключения к пространству имен Service Bus. Если вы не знакомы с Azure, вам может быть проще работать с вариантом строки подключения. Мы рекомендуем использовать параметр без пароля в реальных приложениях и рабочих средах. Дополнительные сведения см. в разделе Проверка подлинности и авторизация Service Bus. Дополнительные сведения о проверке подлинности без пароля см. в статье "Проверка подлинности приложений .NET".

Назначение ролей пользователю Microsoft Entra

При локальной разработке убедитесь, что учетная запись пользователя, которая подключается к служебной шине Azure, имеет правильные разрешения. Для отправки и получения сообщений требуется роль владельца данных служебной шины Azure . Чтобы назначить себе эту роль, вам потребуется роль администратора доступа пользователей или другая роль, которая включает Microsoft.Authorization/roleAssignments/write действие.

Роли Azure RBAC можно назначить пользователю с помощью портала Azure, Azure CLI или Azure PowerShell. Дополнительные сведения о доступных диапазонах для назначения ролей смотрите в статье "Общие сведения об области Azure RBAC".

В следующем примере Azure Service Bus Data Owner учетной записи пользователя назначается роль, которая предоставляет полный доступ к ресурсам Служебной шины Azure. В реальном сценарии следуйте принципу наименьших привилегий , чтобы предоставить пользователям только минимальные разрешения, необходимые для более безопасной рабочей среды.

Встроенные роли Azure для служебной шины Azure

Для служебной шины Azure управление пространствами имен и всеми связанными ресурсами через портал Azure и API управления ресурсами Azure уже защищено с помощью модели Azure RBAC. Azure предоставляет следующие встроенные роли службы Azure для авторизации доступа к пространству имен службы Service Bus:

Если вы хотите создать пользовательскую роль, см. Права, необходимые для операций в Service Bus.

Добавление пользователя Microsoft Entra в роль владельца службы Службы шины сообщений Azure

Добавьте имя пользователя Microsoft Entra в роль владельца данных Azure Service Bus на уровне пространства имен Service Bus. Эта конфигурация позволяет приложению, работающему в контексте учетной записи пользователя, отправлять сообщения в очередь или раздел. Он может получать сообщения из очереди или подписки на тему.

Внимание

В большинстве случаев для распространения назначения ролей в Azure требуется минута или две. В редких случаях может потребоваться до восьми минут. Если при первом запуске кода возникают ошибки аутентификации, подождите несколько минут и повторите попытку.

  1. Если на портале Azure не открыта страница пространства имен Service Bus, найдите пространство имен Service Bus с использованием главной панели поиска или навигации слева.

  2. На странице обзора выберите элемент управления доступом (IAM) в меню слева.

  3. На странице Контроль доступа (IAM) откройте вкладку Назначения ролей.

  4. Выберите +Добавить из верхнего меню и добавьте назначение ролей.

    Снимок экрана, на котором продемонстрировано назначение роли.

  5. Используйте поле поиска, чтобы отфильтровать результаты для отображения нужной роли. В этом примере найдите Azure Service Bus Data Owner и выберите соответствующий результат. Теперь щелкните Далее.

  6. В разделе Назначение доступа выберите Пользователь, группа или служебный принципал, затем выберите + Выбрать участников.

  7. В диалоговом окне найдите имя пользователя Microsoft Entra (обычно это адрес вашей электронной почты в формате user@domain), а затем выберите Выбрать в нижней части диалогового окна.

  8. Нажмите кнопку Проверить и назначить, чтобы перейти на последнюю страницу, а затем еще раз Проверить и назначить, чтобы завершить процесс.

Запуск Visual Studio

Вы можете авторизовать доступ к пространству имен служебной шины, выполнив следующие действия.

  1. Запустите Visual Studio. Если появится окно "Начало работы ", выберите " Продолжить без ссылки на код " в правой области.

  2. Нажмите кнопку Войти в правом верхнем углу Visual Studio.

    Снимок экрана: кнопка входа в Visual Studio.

  3. Войдите с помощью учетной записи Microsoft Entra, которой ранее была назначена роль.

    Снимок экрана: диалоговое окно выбора учетной записи.

Отправка сообщений в очередь

В этом разделе показано, как можно создать консольное приложение .NET, чтобы отправлять сообщения в очередь Service Bus.

Примечание.

В этом кратком руководстве содержатся пошаговые инструкции для реализации простого сценария отправки пакета сообщений в очередь Служебной шины и их получения. Дополнительные примеры для других и более сложных сценариев см. в примерах Служебной шины для .NET на GitHub.

Создайте консольное приложение

  1. В Visual Studio выберите "Файл ->Создать ->Проект".

  2. В диалоговом окне Создать проект выполните следующие действия: (если это диалоговое окно не отображается, щелкните в меню пункт Файл, затем последовательно выберите Создать и Проект).

    1. Выберите язык программирования C#.

    2. Для типа приложения выберите значение Консоль.

    3. Выберите консольное приложение из списка результатов.

    4. Затем выберите Далее.

      Снимок экрана: диалоговое окно

  3. Введите QueueSender в качестве имени проекта, ServiceBusQueueQuickStart в качестве имени решения, после чего нажмите Далее.

    Снимок экрана: имена решений и проектов в диалоговом окне

  4. На странице Дополнительная информация выберите Создать для создания решения и проекта.

Добавление пакетов NuGet в проект

  1. Выберите в меню элементы Инструменты>Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

  2. Выполните следующую команду, чтобы установить пакет NuGet Azure.Messaging.ServiceBus .

    Install-Package Azure.Messaging.ServiceBus
    
  3. Выполните следующую команду, чтобы установить пакет NuGet Azure.Identity .

    Install-Package Azure.Identity
    

Добавление кода для отправки сообщений в очередь

  1. Замените все содержимое Program.cs следующим кодом: Важные шаги описаны в следующем разделе с дополнительными сведениями в комментариях кода.

    Внимание

    Обновите значения заполнителей (<NAMESPACE-NAME> и <QUEUE-NAME>) в фрагменте кода, подставив имена пространства имен и очереди вашей шины обслуживания.

    using Azure.Messaging.ServiceBus;
    using Azure.Identity;
    
    // name of your Service Bus queue
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the sender used to publish messages to the queue
    ServiceBusSender sender;
    
    // number of messages to be sent to the queue
    const int numOfMessages = 3;
    
    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses the port 443. 
    // If you use the default AmqpTcp, ensure that ports 5671 and 5672 are open.
    var clientOptions = new ServiceBusClientOptions
    { 
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    //TODO: Replace the "<NAMESPACE-NAME>" and "<QUEUE-NAME>" placeholders.
    client = new ServiceBusClient(
        "<NAMESPACE-NAME>.servicebus.windows.net",
        new DefaultAzureCredential(),
        clientOptions);
    sender = client.CreateSender("<QUEUE-NAME>");
    
    // create a batch 
    using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    
    for (int i = 1; i <= numOfMessages; i++)
    {
        // try adding a message to the batch
        if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
        {
            // if it is too large for the batch
            throw new Exception($"The message {i} is too large to fit in the batch.");
        }
    }
    
    try
    {
        // Use the producer client to send the batch of messages to the Service Bus queue
        await sender.SendMessagesAsync(messageBatch);
        Console.WriteLine($"A batch of {numOfMessages} messages has been published to the queue.");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await sender.DisposeAsync();
        await client.DisposeAsync();
    }
    
    Console.WriteLine("Press any key to end the application");
    Console.ReadKey();
    
  2. Выполните сборку проекта и убедитесь, что она прошла без ошибок.

  3. Выполните программу и дождитесь подтверждающего сообщения.

    A batch of 3 messages has been published to the queue
    

    Внимание

    В большинстве случаев для распространения назначения ролей в Azure требуется минута или две. В редких случаях может потребоваться до восьми минут. Если при первом запуске кода возникают ошибки аутентификации, подождите несколько минут и повторите попытку.

  4. На портале Azure выполните следующие действия:

    1. Перейдите к пространству имен вашего Service Bus.

    2. На странице Обзор выберите очередь в центральной области снизу.

      Снимок экрана: страница неймспейса служебной шины на портале Azure с выбранной очередью.

    3. Обратите внимание на значения в разделе "Параметры ".

      Снимок экрана: количество полученных сообщений и размер очереди.

    Обратите внимание на следующие значения:

    • Значение счетчика Активных сообщений для очереди теперь равно 3. Всякий раз, когда вы запускаете это приложение-отправитель без получения сообщений, это значение увеличивается на 3.
    • Текущий размер очереди увеличивается каждый раз, когда приложение добавляет сообщения в очередь.
    • На диаграмме Сообщения в нижнем разделе Показатели вы можете увидеть, что в очереди есть три входящих сообщения.

Получение сообщений из очереди

В этом разделе описано, как создать консольное приложение .NET, которое получает сообщения из очереди.

Примечание.

В этом кратком руководстве приведены пошаговые инструкции по реализации сценария отправки пакета сообщений в очередь в Service Bus и последующего их получения. Дополнительные примеры для других и более сложных сценариев см. в примерах Служебной шины для .NET на GitHub.

Создание проекта для получателя

  1. В окне Обозревателя решений щелкните правой кнопкой мыши решение ServiceBusQueueQuickStart, выберите Добавить и выберите Новый проект.
  2. Выберите Консольное приложение и нажмите Далее.
  3. Введите QueueReceiver в поле Название проекта и выберите Создать.
  4. В окне Обозреватель решений щелкните правой кнопкой мыши QueueReceiver и выберите Установить как запускаемый проект.

Добавление пакетов NuGet в проект

  1. Выберите в меню элементы Инструменты>Диспетчер пакетов NuGet>Консоль диспетчера пакетов.

  2. Выберите QueueReceiver для проекта по умолчанию.

    Снимок экрана: проект QueueReceiver, выбранный в консоли диспетчера пакетов.

  3. Выполните следующую команду, чтобы установить пакет NuGet Azure.Messaging.ServiceBus .

    Install-Package Azure.Messaging.ServiceBus
    
  4. Выполните следующую команду, чтобы установить пакет NuGet Azure.Identity .

    Install-Package Azure.Identity
    

Добавьте код для получения сообщений из очереди

В этом разделе вы добавите код для получения сообщений из очереди.

  1. Program В классе добавьте следующий код:

    using System.Threading.Tasks;
    using Azure.Identity;
    using Azure.Messaging.ServiceBus;
    
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the processor that reads and processes messages from the queue
    ServiceBusProcessor processor;
    
  2. Добавьте следующие методы в конец Program класса.

    // handle received messages
    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine($"Received: {body}");
    
        // complete the message. message is deleted from the queue. 
        await args.CompleteMessageAsync(args.Message);
    }
    
    // handle any errors when receiving messages
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
  3. Добавьте следующий код в конец Program класса. Важные шаги описаны в следующем разделе с дополнительными сведениями в комментариях кода.

    • Создает объект ServiceBusClient с помощью DefaultAzureCredential объекта. DefaultAzureCredential автоматически обнаруживает и использует учетные данные входа в Visual Studio для аутентификации в Службе шины Azure.
    • Вызов метода CreateProcessor для объекта ServiceBusClient. Это позволяет создать объект ServiceBusProcessor для указанной очереди служебной шины.
    • Указание обработчиков для событий ProcessMessageAsync и ProcessErrorAsync объекта ServiceBusProcessor.
    • Запуск обработки сообщений путем вызова StartProcessingAsync для объекта ServiceBusProcessor.
    • Вызов StopProcessingAsync для объекта ServiceBusProcessor при нажатии пользователем кнопки для завершения обработки.

    Внимание

    Обновите значения заполнителей (<NAMESPACE-NAME> и <QUEUE-NAME>) в фрагменте кода именами вашего пространства имен Service Bus и очереди.

    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses port 443. 
    // If you use the default AmqpTcp, make sure that ports 5671 and 5672 are open.
    
    // TODO: Replace the <NAMESPACE-NAME> placeholder
    var clientOptions = new ServiceBusClientOptions()
    {
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    client = new ServiceBusClient(
        "<NAMESPACE-NAME>.servicebus.windows.net",
        new DefaultAzureCredential(),
        clientOptions);
    
    // create a processor that we can use to process the messages
    // TODO: Replace the <QUEUE-NAME> placeholder
    processor = client.CreateProcessor("<QUEUE-NAME>", new ServiceBusProcessorOptions());
    
    try
    {
        // add handler to process messages
        processor.ProcessMessageAsync += MessageHandler;
    
        // add handler to process any errors
        processor.ProcessErrorAsync += ErrorHandler;
    
        // start processing 
        await processor.StartProcessingAsync();
    
        Console.WriteLine("Wait for a minute and then press any key to end the processing");
        Console.ReadKey();
    
        // stop processing 
        Console.WriteLine("\nStopping the receiver...");
        await processor.StopProcessingAsync();
        Console.WriteLine("Stopped receiving messages");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await processor.DisposeAsync();
        await client.DisposeAsync();
    }
    
  4. Завершенный Program класс должен соответствовать следующему коду:

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    using Azure.Identity;
    
    // the client that owns the connection and can be used to create senders and receivers
    ServiceBusClient client;
    
    // the processor that reads and processes messages from the queue
    ServiceBusProcessor processor;
    
    // The Service Bus client types are safe to cache and use as a singleton for the lifetime
    // of the application, which is best practice when messages are being published or read
    // regularly.
    //
    // Set the transport type to AmqpWebSockets so that the ServiceBusClient uses port 443.
    // If you use the default AmqpTcp, make sure that ports 5671 and 5672 are open.
    
    // TODO: Replace the <NAMESPACE-NAME> and <QUEUE-NAME> placeholders
    var clientOptions = new ServiceBusClientOptions() 
    {
        TransportType = ServiceBusTransportType.AmqpWebSockets
    };
    client = new ServiceBusClient("<NAMESPACE-NAME>.servicebus.windows.net", 
        new DefaultAzureCredential(), clientOptions);
    
    // create a processor that we can use to process the messages
    // TODO: Replace the <QUEUE-NAME> placeholder
    processor = client.CreateProcessor("<QUEUE-NAME>", new ServiceBusProcessorOptions());
    
    try
    {
        // add handler to process messages
        processor.ProcessMessageAsync += MessageHandler;
    
        // add handler to process any errors
        processor.ProcessErrorAsync += ErrorHandler;
    
        // start processing 
        await processor.StartProcessingAsync();
    
        Console.WriteLine("Wait for a minute and then press any key to end the processing");
        Console.ReadKey();
    
        // stop processing 
        Console.WriteLine("\nStopping the receiver...");
        await processor.StopProcessingAsync();
        Console.WriteLine("Stopped receiving messages");
    }
    finally
    {
        // Calling DisposeAsync on client types is required to ensure that network
        // resources and other unmanaged objects are properly cleaned up.
        await processor.DisposeAsync();
        await client.DisposeAsync();
    }
    
    // handle received messages
    async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine($"Received: {body}");
    
        // complete the message. message is deleted from the queue. 
        await args.CompleteMessageAsync(args.Message);
    }
    
    // handle any errors when receiving messages
    Task ErrorHandler(ProcessErrorEventArgs args)
    {
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
  5. Выполните сборку проекта и убедитесь, что она прошла без ошибок.

  6. Запустите приложение получателя. Вы должны увидеть полученные сообщения. Нажмите любую клавишу, чтобы остановить работу приемника и приложения.

    Wait for a minute and then press any key to end the processing
    Received: Message 1
    Received: Message 2
    Received: Message 3
    
    Stopping the receiver...
    Stopped receiving messages
    
  7. Снова просмотрите сведения на портале. Подождите несколько минут и обновите страницу, если вы не видите 0 для Активных сообщений.

    • Значения Активных сообщений и Текущий размер теперь равны 0.

    • На диаграмме Сообщения в разделе Метрики в нижней части страницы можно увидеть, что в очередь поступило три входящих и три исходящих сообщения.

      Снимок экрана: активные сообщения и размер после получения.

Дополнительная информация:

Ознакомьтесь со следующими примерами и документацией:

Очистка ресурсов

Перейдите к пространству имен службы шины на портале Azure и выберите Удалить на портале Azure, чтобы удалить пространство имен и очередь в нём.

См. Начало работы с темами и подписками в Azure Service Bus (.NET).