Упражнение. Создание и тестирование простой функции Azure локально с помощью Visual Studio

Завершено

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

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

В этом упражнении вы реализуете и тестируете версию этой функции локально с помощью Visual Studio.

Примечание.

Прежде чем начать это упражнение, убедитесь, что установлен vs 2022, а также расширения веб-рабочей нагрузки ASP.NET и веб-разработки и разработки Azure.

Создание приложения-функции Azure

Создайте приложение-функцию Azure с помощью шаблона Функции Azure.

  1. Запустите Visual Studio Installer и на начальной странице Visual Studio 2022 нажмите кнопку "Изменить".

  2. Убедитесь, что выбраны и доступны рабочие нагрузки ASP.NET и веб-разработка и Разработка Azure (в противном случае выберите Установить при скачивании), а затем нажмите кнопку Закрыть.

    Снимок экрана: Visual Studio 2022 с выделенными рабочими нагрузками asp dot net и azure для разработки.

  3. На начальной странице Visual Studio 2022 выберите "Запустить".

  4. В меню Начало работы выберите команду Создать проект. Откроется страница Создание нового проекта.

  5. Найдите шаблон Функции Azure или прокрутите список до этого шаблона, а затем нажмите кнопку Далее.

    Снимок экрана: Visual Studio 2022 Создание страницы проекта с выделенным шаблоном Функции Azure.

  6. Откроется страница Настройка нового проекта. Введите следующие значения.

    Поле значение
    Имя проекта WatchPortalFunction
    Местонахождение Выберите расположение для хранения проекта, перейдя в папку или создав папку на локальном компьютере.
    Имя решения Примите значение WatchPortalFunction (по умолчанию).
    Поместите решение и проект в один каталог Флажок снят (не выбран). Этот параметр гарантирует правильную структуру папок для этого модуля.

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

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

  8. Откроется страница дополнительных сведений.

  9. Выберите следующие значения.

    Поле значение
    Версия Dotnet *.NET 6.0 (долгосрочная поддержка)
    Триггер функции Триггер HTTP
    Использование Azurite для учетной записи хранения среды выполнения (AzureWebJobsStorage) Помечено
    Включение Docker Флажок снят
    Уровень авторизации Анонимный.

    Если в уведомлении Visual Studio указано, что обновления готовы, нажмите Обновить.

  10. Нажмите кнопку создания.

    Снимок экрана: триггеры Функций Azure с выделенным триггером HTTP.

    Visual Studio создает проект WatchPortalFunction и отображает файл исходного кода приложения-функции Function1.cs в окне редактора кода. Файл содержит код для класса с именем Function1.

    Как показано в следующем примере кода, Function1 класс содержит стандартный код из шаблона триггера HTTP. Метод Run помечается атрибутом [FunctionName ("Function1")]. Как было указано на предыдущем уроке, стандартные параметры для метода Run являются объектом HttpRequest, содержащим сведения о запросе, который активировал функцию, и запись журнала трассировки для записи данных трассировки.

    namespace WatchPortalFunction
    {
        public static class Function1
        {
            [FunctionName("Function1")]
            public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
            {
                log.LogInformation("C# HTTP trigger function processed a request.");
    
                string name = req.Query["name"];
    
                string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
                dynamic data = JsonConvert.DeserializeObject(requestBody);
                name = name ?? data?.name;
    
                return name != null
                    ? (ActionResult)new OkObjectResult($"Hello, {name}")
                    : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
            }
        }
    }
    

Создание функции Azure WatchInfo

  1. В меню "Вид" выберите Обозреватель решений. В окне Обозреватель решений щелкните правой кнопкой мыши проект Функций Azure WatchPortalFunction и в контекстном меню выберите команду Добавить>Новая Функция Azure.

    Снимок экрана: окно Обозреватель решений. Пользователь выбрал add —> New Azure Function.

  2. В окне Добавление нового элемента — WatchPortalFunction щелкните Функция Azure. В поле Имя введите WatchInfo.cs, а затем выберите Добавить.

    Снимок экрана: окно

  3. В окне Новая функция Azure — WatchInfo щелкните Триггер HTTP. Из раскрывающегося списка Уровень авторизации выберите Анонимный режим и Добавить.

    Снимок экрана: окно

    Visual Studio создает новую функцию, а метод Run помечается атрибутом [FunctionName("WatchInfo")].

  4. В теле функции Run удалите код после строки log.LogInformation. Результат должен выглядеть следующим образом.

    namespace WatchPortalFunction
    {
        public static class WatchInfo
        {
            [FunctionName("WatchInfo")]
            public static async Task<IActionResult> Run(
                [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
                ILogger log)
            {
                log.LogInformation("C# HTTP trigger function processed a request.");
            }
        }
    }
    
  5. Вставьте приведенный ниже код в метод Run после строки log.LogInformation.

    // Retrieve the model id from the query string
    string model = req.Query["model"];
    
    // If the user specified a model id, find the details of the model of watch
    if (model != null)
    {
        // Use dummy data for this example
        dynamic watchinfo = new { Manufacturer = "abc", CaseType = "Solid", Bezel = "Titanium", Dial = "Roman", CaseFinish = "Silver", Jewels = 15 };
    
        return (ActionResult)new OkObjectResult($"Watch Details: {watchinfo.Manufacturer}, {watchinfo.CaseType}, {watchinfo.Bezel}, {watchinfo.Dial}, {watchinfo.CaseFinish}, {watchinfo.Jewels}");
    }
    return new BadRequestObjectResult("Please provide a watch model in the query string");
    

    Этот код считывает параметр model из строки запроса в HTTP-запросе и возвращает сведения об этой модели часов. В этом примере кода мы создали фиктивные данные, возвращаемые watchinfo независимо от значения model. Функция возвращает ответ, содержащий эти сведения. Или, если HTTP-запрос не содержит строку запроса, функция возвращает сообщение об ошибке. В реальном примере вы будете использовать model значение для поиска правильного watchinfo возвращаемого значения.

Тестирование функции Azure локально

  1. На панели команд выберите Отладка>Начать отладку.

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

    Снимок экрана: окно среды выполнения Функции Azure. Среда выполнения запускает приложение-функцию Azure и отображает URL-адреса для Функции Azure

  2. Откройте веб-браузер и введите URL-адрес, отображаемый в окне среды выполнения. URL-адрес по умолчанию — http://localhost:7071/api/WatchInfo?model=abcэто url-адрес, который мы используем в этом упражнении. Запрос активирует WatchInfo функцию и передает модель abc в качестве параметра строки запроса. В веб-браузере должны отображаться фиктивные сведения, созданные функцией.

    Снимок экрана: веб-браузер с активацией функции Azure WatchInfo. Функция возвращает фиктивные сведения для модели, указанной в строке запроса указанного URL-адреса.

  3. Введите URL-адрес http://localhost:7071/api/WatchInfo. Этот запрос не содержит строку запроса. Триггер возвращает ответ об ошибке, и в веб-браузере отображается сообщение Please provide a watch model in the query string.

  4. Закройте веб-браузер, но оставьте работать приложение-функцию Azure.

  5. В Visual Studio установите точку останова в строке кода, который извлекает модель из строки запроса.

    Снимок экрана: Visual Studio с точкой останова на операторе, который считывает модель из строки запроса.

  6. Перезапустите веб-браузер и введите URL-адрес без строки запроса, http://localhost:7071/api/WatchInfo.

    Visual Studio выделяет код в точке останова, где выполнение приостанавливается.

  7. В Visual Studio нажмите клавишу F10, чтобы обойти оператор в точке останова.

  8. На вкладке Видимые окна отладчика убедитесь, что переменная model имеет значение null. Переменная показывает это значение, так как строка запроса не содержит параметр модели.

    Снимок экрана: отладчик Visual Studio, в котором отображается значение переменной модели.

  9. Еще раз нажмите клавишу F10 и убедитесь, что управление переходит к инструкции, которая возвращает объект BadRequestObjectResult.

  10. Нажмите клавишу F5, чтобы продолжить выполнение метода, и вернитесь к веб-браузеру. Должно отобразиться то же сообщение об ошибке.

  11. В веб-браузере введите URL-адрес со строкой запроса и параметром модели. Выполните шаги по функции в отладчике и убедитесь, что модель получена правильно. Переменная model должна быть заполнена значением параметра, а сведения о модели должны возвращаться в виде объекта OkObjectResult.

  12. В строке меню выберите Отладка>Остановить отладку.

В этом упражнении вы узнали, как расширение средств Функции Azure в Visual Studio упрощает создание приложения-функции Azure, позволяя использовать знакомые средства для создания и отладки кода.