Многоуровневое приложение .NET, использующее очереди служебной шины Azure

С Visual Studio и бесплатным пакетом Azure SDK для .NET разрабатывать решения для Microsoft Azure очень просто. В этом руководстве рассматриваются действия по созданию приложения, в котором используется несколько ресурсов Azure, работающих в локальной среде.

Вы узнаете следующее:

  • Как подготовить свой компьютер к разработке приложений для Azure, загрузив и установив всего один пакет.
  • Как разработать приложение для Azure с помощью Visual Studio.
  • Как создать многоуровневое приложение в Azure с использованием рабочей роли и веб-роли.
  • Обеспечение обмена данными между уровнями с помощью очередей служебной шины.

Примечание.

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

В этом руководстве вы создадите и запустите многоуровневое приложение в облачной службе Azure. Внешний интерфейс реализован с использованием веб-роли MVC ASP.NET, а серверная часть — с помощью рабочей роли, в которой используется очередь служебной шины. Вы также можете создать аналогичное многоуровневое приложение. Его внешний интерфейс будет реализован в виде веб-проекта, развернутого на веб-сайте Azure, а не в облачной службе. Кроме того, можно ознакомиться с руководством по гибридным локальным и облачным приложениям .NET.

На снимке экрана ниже показано готовое приложение.

Application's Submit page

Обзор сценария: обмен данными между ролями

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

Обмен сообщениями между веб-уровнем и средним уровнем через служебную шину позволяет разделить два компонента. В отличие от прямого обмена сообщениями (то есть TCP или HTTP), веб-уровень не подключается к среднему уровню напрямую; вместо этого он отправляет единицы работы, как сообщения, в служебная шина, которая надежно сохраняет их до тех пор, пока средний уровень не будет готов к использованию и обработке.

В служебной шине обмен сообщениями через брокер реализуется с использованием двух видов сущностей — очередей и разделов. При использовании очередей каждое сообщение, помещенное в очередь, потребляется одним получателем. При использовании разделов каждое опубликованное сообщение становится доступным в рамках подписки, зарегистрированной с помощью этого раздела. Для каждой подписки ведется собственная логическая очередь сообщений. Кроме того, для подписки можно настроить правила фильтрации, с помощью которых ограничивается набор сообщений, передаваемых в очередь подписки. В этом примере используются очереди служебной шины.

Diagram showing the communication between the Web Role, Service Bus, and the Worker Role.

По сравнению с прямым обменом сообщениями этот механизм взаимодействия имеет ряд преимуществ.

  • Временное разделение. При использовании шаблона асинхронного обмена сообщениями производители и потребители не должны быть в сети одновременно. Служба Service Bus хранит сообщения до тех пор, пока принимающая сторона не будет готова принять их. Это позволяет разделять компоненты распределенного приложения как в плановых ситуациях (например, для обслуживания), так и в экстренных случаях, чтобы исключить влияние сбоя одного компонента на систему в целом. Более того, потребляющему приложению достаточно находиться в сети несколько раз в день в определенное время.

  • Распределение нагрузки. Во многих приложениях уровень нагрузки на систему меняется с течением времени, тогда как время, затрачиваемое на обработку каждой рабочей единицы, как правило, постоянно. Благодаря обмену сообщениями через посредника с использованием очереди потребляющее приложение (рабочая роль) достаточно подготовить для обработки средней, а не пиковой нагрузки. При колебаниях входящей нагрузки просто изменяется глубина очереди. Это позволяет заметно сократить расходы на инфраструктуру, необходимую для обработки нагрузки приложения.

  • Балансировка нагрузки. По мере возрастания нагрузки могут потребоваться дополнительные рабочие процессы для чтения из очереди. Каждое сообщение обрабатывается одним рабочим процессом. Кроме того, эта балансировка нагрузки на основе вытягивания обеспечивает оптимальное использование рабочих машин, даже если рабочие машины отличаются с точки зрения вычислительной мощности, так как они будут извлекать сообщения по своей максимальной скорости. Такой подход часто называют моделью конкурирующих потребителей.

    Diagram showing the communication between the Web Role, the Service Bus, and two Worker Roles.

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

Необходимые компоненты

В этом руководстве вы будете использовать проверку подлинности Microsoft Entra для создания и ServiceBusAdministrationClient объектовServiceBusClient. Вы также будете использовать DefaultAzureCredential, и для его использования вам необходимо выполнить следующие шаги, чтобы протестировать приложение локально в среде разработки.

  1. Зарегистрируйте приложение в идентификаторе Microsoft Entra.
  2. Добавьте приложение в Service Bus Data Owner роль.
  3. Задайте переменные среды AZURE-CLIENT-ID, AZURE-TENANT-ID И AZURE-CLIENT-SECRET. Инструкции см. в этой статье.

Список встроенных ролей служебная шина см. в статье о встроенных ролях Azure для служебная шина.

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

Сначала нужно создать пространство имен и получить ключ подписанного URL-адреса (SAS) для него. Пространство имен определяет границы каждого приложения, предоставляемого через служебную шину. Ключ SAS создается системой при создании пространства имен. Сочетание имени пространства имен и ключа SAS дает учетные данные, на основе которых служебная шина осуществляет проверку подлинности и предоставляет доступ к приложению.

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

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

Создание пространства имен службы:

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

  2. Перейдите на страницу "Все службы".

  3. На панели навигации слева выберите "Интеграция" из списка категорий, наведите указатель мыши на служебная шина, а затем нажмите + кнопку на плитке служебная шина.

    Image showing selection of Create a resource, Integration, and then Service Bus in the menu.

  4. В теге Основные сведения на странице Создание пространства имен выполните следующие действия:

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

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

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

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

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

      Внимание

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

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

    6. В нижней части страницы выберите Review + create (Проверить и создать).

      Image showing the Create a namespace page

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

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

    Image showing the deployment succeeded page with the Go to resource link.

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

    Image showing the home page of the Service Bus namespace created.

Получение строка подключения в пространство имен (портал Azure)

При создании нового пространства имен автоматически создается начальная политика подписанного URL-адреса (SAS), первичный и вторичный ключи, а также первичная и вторичная строки подключения, каждая из которых предоставляет полный контроль над всеми аспектами пространства имен. Сведения о том, как в дальнейшем создавать правила с ограниченными правами для постоянных отправителей и получателей, см. в статье Аутентификация и авторизация в служебной шине.

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

  1. На странице Пространство имен служебной шины выберите Политики общего доступа в меню слева.

  2. На странице Политики общего доступа щелкните RootManageSharedAccessKey.

  3. В окне Политика: RootManageSharedAccessKey нажмите кнопку копирования рядом с полем Первичная строка подключения, чтобы скопировать строку подключения в буфер обмена для последующего использования. Вставьте на время эти значения в Блокноте или любом другом месте.

    Screenshot shows an S A S policy called RootManageSharedAccessKey, which includes keys and connection strings.

    Эту страницу можно использовать для копирования первичного и вторичного ключей, а также первичной и вторичной строки подключения.

Создание веб-роли

В этом разделе описывается создание интерфейсной части вашего приложения. Сначала вы создадите страницы, которые будут отображаться в приложении, а затем — добавите код для отправки элементов в очередь служебной шины и отображения сведений о ее состоянии.

Создание проекта

  1. С помощью привилегий администратора запустите Visual Studio: щелкните правой кнопкой мыши значок программы Visual Studio и выберите команду "Запуск от имени администратора". Для работы эмулятора вычислений Azure, который обсуждается далее в этой статье, требуется запустить Visual Studio с правами администратора.

    В Visual Studio в меню Файл последовательно выберите пункты Создать и Проект.

  2. На странице Шаблоны выполните следующие действия:

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

    2. Выберите Облако в качестве типа проекта.

    3. Выберите Облачная служба Azure.

    4. Выберите Далее.

      Screenshot of the New Project dialog box with Cloud selected and Azure Cloud Service Visual C# highlighted and outlined in red.

  3. Назовите проект MultiTierApp, выберите местоположение для проекта и затем выберите Создать.

    Specify project name.

  4. На странице Роли дважды щелкните Веб-роль ASP.NET и выберите ОК.

    Select Web Role

  5. Наведите указатель мыши на WebRole1 в решении облачной службы Azure, выберите значок карандаша и переименуйте веб-роль в FrontendWebRole. Затем выберите OK. (Обратите внимание на написание слова «Frontend» со строчной буквой «e» — не «FrontEnd».)

    Screenshot of the New Microsoft Azure Cloud Service dialog box with the solution renamed to FrontendWebRole.

  6. В диалоговом окне Создание нового веб-приложения ASP.NET выберите MVC, после чего выберите Создать.

    Screenshot of the New ASP.NET Project dialog box with MVC highlighted and outlined in red and the Change Authentication option outlined in red.

  7. В Обозреватель решений в проекте FrontendWebRole щелкните правой кнопкой мыши ссылки и выберите пункт "Управление пакетами NuGet".

  8. Выберите вкладку Обзор, после чего найдите Azure.Messaging.ServiceBus. Выберите пакет Azure.Messaging.ServiceBus, выберите Установить и примите условия использования.

    Screenshot of the Manage NuGet Packages dialog box with the Azure.Messaging.ServiceBus highlighted and the Install option outlined in red.

    Заметьте, что добавлены ссылки на требуемые клиентские сборки, а также новые файлы кода.

  9. Выполните те же действия, чтобы добавить в проект пакет NuGet Azure.Identity.

  10. В Обозреватель решений разверните FronendWebRole, щелкните правой кнопкой мыши "Модели" и выберите "Добавить", а затем выберите "Класс". В поле Имя введите имя OnlineOrder.cs. Нажмите кнопку Добавить.

Написание кода веб-роли

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

  1. В файле OnlineOrder.cs в Visual Studio замените существующее определение пространства имен следующим кодом:

    namespace FrontendWebRole.Models
    {
        public class OnlineOrder
        {
            public string Customer { get; set; }
            public string Product { get; set; }
        }
    }
    
  2. В обозревателе решений дважды щелкните Controllers\HomeController.cs. Добавьте в начало файла оператор using, чтобы включить служебную шину и пространства имен для созданной модели.

     using FrontendWebRole.Models;
     using Azure.Messaging.ServiceBus;    
    
  3. Кроме того, в файле HomeController.cs в Visual Studio замените существующее определение пространства имен следующим кодом. Этот код содержит методы, обрабатывающие операции отправки элементов в очередь.

    namespace FrontendWebRole.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                // Simply redirect to Submit, since Submit will serve as the
                // front page of this application.
                return RedirectToAction("Submit");
            }
    
            public ActionResult About()
            {
                return View();
            }
    
            // GET: /Home/Submit.
            // Controller method for a view you will create for the submission
            // form.
            public ActionResult Submit()
            {
                // Will put code for displaying queue message count here.
    
                return View();
            }
    
            // POST: /Home/Submit.
            // Controller method for handling submissions from the submission
            // form.
            [HttpPost]
            // Attribute to help prevent cross-site scripting attacks and
            // cross-site request forgery.  
            [ValidateAntiForgeryToken]
            public ActionResult Submit(OnlineOrder order)
            {
                if (ModelState.IsValid)
                {
                    // Will put code for submitting to queue here.
    
                    return RedirectToAction("Submit");
                }
                else
                {
                    return View(order);
                }
            }
        }
    }
    
  4. В меню "Сборка" выберите "Создать решение", чтобы проверить точность работы до сих пор.

  5. Теперь создайте представление для ранее созданного метода Submit(). Щелкните правой кнопкой мыши внутри метода Submit()(перегрузка Submit(), не принимающего параметров) в файле HomeController.cs, после чего выберите Добавить представление.

  6. В диалоговом окне Добавить новый шаблонный элемент выберите Добавить.

  7. В диалоговом окне Добавить представление выполните следующие действия:

    1. В списке Шаблон выберите Создать.

    2. В списке Класс модели выберите класс OnlineOrder.

    3. Выберите Добавить.

      A screenshot of the Add View dialog box with the Template and Model class drop-down lists outlined in red.

  8. Теперь измените отображаемое имя приложения. В обозревателе решений дважды щелкните файл Views\Shared\_Layout.cshtml, чтобы открыть его в редакторе Visual Studio.

  9. Замените все вхождения элемента Мое приложение ASP.NET текстом Продукты Northwind Traders.

  10. Удалите ссылки Главная, О программе и Контакт. Удалите выделенный код.

    Screenshot of the code with three lines of H T M L Action Link code highlighted.

  11. Наконец, добавьте на страницу отправки необходимые сведения об очереди. В обозревателе решений дважды щелкните файл Views\Home\Submit.cshtml, чтобы открыть его в редакторе Visual Studio. Добавьте следующую строку после <h2>Submit</h2>. Сейчас элемент ViewBag.MessageCount пустой. Вы заполните его позже.

    <p>Current number of orders in queue waiting to be processed: @ViewBag.MessageCount</p>
    
  12. Пользовательский интерфейс реализован. Нажмите клавишу F5, чтобы запустить приложение и подтвердить его работоспособность.

    Screenshot of the application's Submit page.

Написание кода для отправки элементов в очередь Service Bus

Теперь добавьте код для отправки элементов в очередь. Сначала вам нужно создать класс, содержащий информацию о подключении к очереди служебной шины, а затем — инициализировать подключение из Global.aspx.cs. И наконец, измените код отправки, созданный ранее в файле HomeController.cs, чтобы элементы отправлялись в очередь служебной шины.

  1. В обозревателе решений щелкните правой кнопкой мыши проект FrontendWebRole (проект, не роль). Нажмите кнопку "Добавить" и выберите "Класс".

  2. Присвойте классу имя QueueConnector.cs. Щелкните Добавить, чтобы создать класс.

  3. Теперь добавьте код, который инкапсулирует сведения о подключении и инициализирует подключение к очереди служебной шины. Замените все содержимое файла QueueConnector.cs приведенным ниже кодом. Введите значения для параметров your Service Bus namespace (имя пространства имен) и yourKey (первичный ключ, ранее полученный на портале Azure).

     using System;
     using System.Collections.Generic;
     using System.Linq;
     using System.Web;
     using System.Threading.Tasks;
     using Azure.Messaging.ServiceBus;
     using Azure.Messaging.ServiceBus.Administration;
    
    namespace FrontendWebRole
    {
         public static class QueueConnector
         {
             // object to send messages to a Service Bus queue
             internal static ServiceBusSender SBSender;
    
             // object to create a queue and get runtime properties (like message count) of queue
             internal static ServiceBusAdministrationClient SBAdminClient;
    
             // Fully qualified Service Bus namespace
             private const string FullyQualifiedNamespace = "<SERVICE BUS NAMESPACE NAME>.servicebus.windows.net";
    
             // The name of your queue.
             internal const string QueueName = "OrdersQueue";
    
             public static async Task Initialize()
             {
                 // Create a Service Bus client that you can use to send or receive messages
                 ServiceBusClient SBClient = new ServiceBusClient(FullyQualifiedNamespace, new DefaultAzureCredential());
    
                 // Create a Service Bus admin client to create queue if it doesn't exist or to get message count
                 SBAdminClient = new ServiceBusAdministrationClient(FullyQualifiedNamespace, new DefaultAzureCredential());
    
                 // create the OrdersQueue if it doesn't exist already
                 if (!(await SBAdminClient.QueueExistsAsync(QueueName)))
                 {
                     await SBAdminClient.CreateQueueAsync(QueueName);
                 }
    
                 // create a sender for the queue 
                 SBSender = SBClient.CreateSender(QueueName);    
             }
         }    
    }
    
  4. Теперь нужно обеспечить вызов метода Initialize. В обозревателе решений дважды щелкните Global.asax\Global.asax.cs.

  5. В конце метода Application_Start добавьте следующую строку кода.

     FrontendWebRole.QueueConnector.Initialize().Wait();
    
  6. Наконец, обновите ранее созданный код веб-уровня, чтобы отправить элементы в очередь. В обозревателе решений дважды щелкните Controllers\HomeController.cs.

  7. Обновите метод Submit() (перегрузка, при которой не принимаются параметры), как показано ниже, чтобы получить число сообщений в очереди.

         public ActionResult Submit()
         {
             QueueRuntimeProperties properties = QueueConnector.adminClient.GetQueueRuntimePropertiesAsync(QueueConnector.queueName).Result;
             ViewBag.MessageCount = properties.ActiveMessageCount;
    
             return View();
         }
    
  8. Обновите метод Submit(OnlineOrder order) (перегрузка, при которой не принимаются параметры), как показано ниже, чтобы отправить сведения о заказе в очередь.

         public ActionResult Submit(OnlineOrder order)
         {
             if (ModelState.IsValid)
             {
                 // create a message 
                 var message = new ServiceBusMessage(new BinaryData(order));
    
                 // send the message to the queue
                 QueueConnector.sbSender.SendMessageAsync(message);
    
                 return RedirectToAction("Submit");
             }
             else
             {
                 return View(order);
             }
         }
    
  9. Теперь можно снова запустить приложение. Каждый раз при отправке заказа значение счетчика сообщений увеличивается.

    Screenshot of the application's Submit page with the message count incremented to 1.

Создание рабочей роли

Теперь вы создадите рабочую роль, которая обрабатывает отправки заказов. В этом примере используется шаблон проекта Visual Studio Worker Role with Service Bus Queue (Рабочая роль с очередью служебной шины). Необходимые учетные данные уже получены с портала.

  1. Убедитесь, что среда Visual Studio подключена к вашей учетной записи Azure.

  2. В обозревателе решений Visual Studio щелкните правой кнопкой мыши папку Роли в проекте MultiTierApp.

  3. Нажмите кнопку "Добавить" и выберите "Создать проект рабочей роли". Откроется диалоговое окно Добавить новый проект роли.

    Screenshot of the Solution Explorer pane with the New Worker Role Project option and Add option highlighted.

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

    Screenshot of the Ad New Role Project dialog box with the Worker Role with Service Bus Queue option highlighted and outlined in red.

  5. В поле Имя введите OrderProcessingRole. Нажмите кнопку Добавить.

  6. В Обозревателе решений щелкните правой кнопкой мыши проект OrderProcessingRole и выберите Управление пакетами NuGet.

  7. Выберите вкладку Обзор, после чего найдите Azure.Messaging.ServiceBus. Выберите пакет Azure.Messaging.ServiceBus, выберите Установить и примите условия использования.

    Screenshot of the Manage NuGet Packages dialog box with the Azure.Messaging.ServiceBus highlighted and the Install option outlined in red.

  8. Выполните те же действия, чтобы добавить в проект пакет NuGet Azure.Identity.

  9. Создайте класс OnlineOrder, который будет представлять заказы из очереди по мере их обработки. При необходимости используйте ранее созданный класс. В обозревателе решений щелкните правой кнопкой мыши класс OrderProcessingRole (значок класса, а не роль). Нажмите кнопку "Добавить", а затем выберите "Существующий элемент".

  10. Перейдите во вложенную папку FrontendWebRole\Models и дважды щелкните файл OnlineOrder.cs, чтобы добавить его в проект.

  11. Добавьте следующий оператор using в файл WorkerRole.cs в проекте OrderProcessingRole.

    using FrontendWebRole.Models;
    using Azure.Messaging.ServiceBus;
    using Azure.Messaging.ServiceBus.Administration; 
    
  12. В WorkerRole.cs добавьте следующие свойства.

    Внимание

    Используйте строку подключения для пространства имен, которое вы записали как часть предварительных требований.

        // Fully qualified Service Bus namespace
        private const string FullyQualifiedNamespace = "<SERVICE BUS NAMESPACE NAME>.servicebus.windows.net";
    
        // The name of your queue.
        private const string QueueName = "OrdersQueue";
    
        // Service Bus Receiver object to receive messages message the specific queue
        private ServiceBusReceiver SBReceiver;
    
    
  13. Обновите метод OnStart, чтобы создать объект ServiceBusClient, а затем объект ServiceBusReceiver для получения сообщений от OrdersQueue.

        public override bool OnStart()
        {
            // Create a Service Bus client that you can use to send or receive messages
            ServiceBusClient SBClient = new ServiceBusClient(FullyQualifiedNamespace, new DefaultAzureCredential());
    
            CreateQueue(QueueName).Wait();
    
            // create a receiver that we can use to receive the message
            SBReceiver = SBClient.CreateReceiver(QueueName);
    
            return base.OnStart();
        }
        private async Task CreateQueue(string queueName)
        {
            // Create a Service Bus admin client to create queue if it doesn't exist or to get message count
            ServiceBusAdministrationClient SBAdminClient = new ServiceBusAdministrationClient(FullyQualifiedNamespace, new DefaultAzureCredential());
    
            // create the OrdersQueue if it doesn't exist already
            if (!(await SBAdminClient.QueueExistsAsync(queueName)))
            {
                await SBAdminClient.CreateQueueAsync(queueName);
            }
        }
    
  14. Обновите метод RunAsync, чтобы включить код для получения сообщений.

        private async Task RunAsync(CancellationToken cancellationToken)
        {
            // TODO: Replace the following with your own logic.
            while (!cancellationToken.IsCancellationRequested)
            {
                // receive message from the queue
                ServiceBusReceivedMessage receivedMessage = await SBReceiver.ReceiveMessageAsync();
    
                if (receivedMessage != null)
                {
                    Trace.WriteLine("Processing", receivedMessage.SequenceNumber.ToString());
    
                    // view the message as an OnlineOrder
                    OnlineOrder order = receivedMessage.Body.ToObjectFromJson<OnlineOrder>();
                    Trace.WriteLine(order.Customer + ": " + order.Product, "ProcessingMessage");
    
                    // complete message so that it's removed from the queue
                    await SBReceiver.CompleteMessageAsync(receivedMessage);
                }
            }
        }
    
  15. Вы завершили приложение. Чтобы протестировать готовое приложение, нужно щелкнуть правой кнопкой мыши проект MultiTierApp в обозревателе решений, потом выбрать команду Назначить запускаемым проектом, а затем нажать клавишу F5. Число сообщений не увеличивается, так как рабочая роль обрабатывает элементы из очереди и помечает их как завершенные. Результаты трассировки рабочей роли вы можете просмотреть в пользовательском интерфейсе эмулятора среды выполнения приложений Azure. Для этого щелкните правой кнопкой мыши значок эмулятора в области уведомлений на панели задач и выберите Show Compute Emulator UI (Показать пользовательский интерфейс эмулятора вычислений).

    Screenshot of what appears when you select the emulator icon. Show Compute Emulator UI is in the list of options.

    Screenshot of the Microsoft Azure Compute Emulator (Express) dialog box.

Следующие шаги

Дополнительную информацию о Service Bus см. на следующих ресурсах.