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

Завершено

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

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

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

Примечание.

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

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

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

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

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

    Снимок экрана Visual Studio 2022 с выделенными рабочими нагрузками разработки ASP.NET и Azure.

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

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

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

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

  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.

    Снимок окна Обозреватель решений. Пользователь выбрал Добавить —> Новая функция Azure.

  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, позволяя использовать знакомые средства для создания и отладки кода.