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

Завершено

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

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

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

Внимание

В этой статье описываются функции библиотеки классов .NET, которые выполняются внутри процесса в среде выполнения. Функции C# также могут выполняться во внепроцессном режиме и изолированы от среды выполнения функций. Модель изолированного рабочего процесса — единственный способ запуска версий .NET и платформа .NET Framework приложений в текущих версиях среды выполнения Функций. Дополнительные сведения см. в статье об изолированных рабочих функциях .NET.

Изменение установки Visual Studio

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

  1. Если Visual Studio 2022 установлен локально, откройте Visual Studio Installer и в Visual Studio Community 2022 выберите "Изменить".

    Снимок экрана: Visual Studio Installer с выделенной кнопкой

  2. Откроется страница Изменение — Visual Studio.

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

  3. На вкладке Рабочие нагрузки установите флажки для рабочих нагрузок ASP.NET и веб-разработка и Разработка Azure, а затем нажмите кнопку Изменить.

  4. В диалоговом окне проверки щелкните Да. Откроется страница Visual Studio Installer, на которой можно отслеживать ход установки пакетов.

Расширение инструментов Функций Azure для Visual Studio

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

Расширение Функции Azure и веб-заданий включается в Visual Studio 2022.

Приложение-функция Azure

Приложение-функция размещает одну или несколько функций. Она предоставляет среду и среду выполнения для кода функции.

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

  • Триггер BLOB-объектов. Функция этого типа выполняется при передаче или изменении файла в хранилище BLOB-объектов Azure.
  • Триггер концентратора событий. Триггер Центров событий запускает функцию, когда концентратор событий получает сообщение.
  • Триггер Azure Cosmos DB. Этот триггер выполняется при добавлении или изменении документа в базе данных Azure Cosmos DB. Этот триггер позволяет интегрировать Azure Cosmos DB с другими службами. Например, если документ, представляющий заказ клиента, добавляется в базу данных, вы можете использовать триггер для отправки копии заказа в очередь для обработки.
  • Триггер HTTP. Триггер HTTP выполняет функцию, когда в веб-приложении возникает HTTP-запрос. Можно также использовать этот триггер для ответа на веб-перехватчики. Веб-перехватчик — это обратный вызов, который происходит при изменении элемента, размещенного на веб-сайте. Например, можно создать функцию, активированную веб-перехватчиком из репозитория GitHub при изменении элемента в репозитории.
  • Триггер очереди. Этот триггер активирует функцию, когда новый элемент добавляется в очередь службы хранилища Azure.
  • Триггер очереди служебной шины. Этот триггер активирует функцию, когда новый элемент добавляется в очередь служебной шины Azure.
  • Триггер раздела служебной шины. Этот триггер запускает функцию в ответ на новое сообщение, поступившее в раздел служебной шины.
  • Триггер таймера. Это событие выполняет функцию через регулярные интервалы, следуя заданному расписанию.

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

В следующей таблице показан самый высокий уровень .NET Core или платформа .NET Framework, который можно использовать с определенной версией функций.

Версия среды выполнения службы "Функции Azure" Внутрипроцессно Изолированный рабочий процесс
Функции 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Функции 1.x .NET Framework 4.8 Н/Д

Приложение-функция Azure хранит сведения об управлении, коде и журналах в службе хранилища Azure. Чтобы сохранить эти данные, создайте учетную запись служба хранилища. Учетная запись хранения должна поддерживать хранилища BLOB-объектов, очередей, файлов и таблиц Azure; для этой цели используйте общую учетную запись хранения Azure. Можно указать учетную запись хранения для функции, используя диалоговое окно, показанное ранее.

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

  • Анонимно. Проверка подлинности не требуется, любой пользователь может активировать функцию.
  • Функция. HTTP-запрос должен предоставлять ключ, который позволяет среде выполнения функции Azure авторизовать запрос. Вы создаете этот ключ отдельно и можете хранить его с помощью портала Azure.
  • Администратор. Аналогично уровню функции. Пользователь должен указать ключ с HTTP-запросом, который активирует функцию. Разница заключается в том, что это ключ администратора. Этот ключ может использоваться для доступа к любой функции в приложении-функции. Как и в случае с ключом функции, вы создаете этот ключ отдельно.

При создании функции, активируемой событиями, а не HTTP-запросами, необходимо предоставить строку соединения и другие сведения, необходимые для доступа приложения-функции к ресурсу, активирующему событие. Например, при написании функции, активируемой событием хранилища BLOB-объектов, необходимо указать строку подключения для соответствующей учетной записи хранения BLOB-объектов.

Структура функции Azure

Функция Azure реализуется в виде статического класса. Этот класс предоставляет статический асинхронный метод с именем Run, который выступает в качестве точки входа для класса.

Параметры, передаваемые в метод Run, предоставляют контекст для триггера. Если это триггер HTTP, функция получает объект HttpRequest . Этот объект содержит заголовок и тело запроса. Вы можете получить доступ к данным в запросе, используя те же способы, которые доступны в любом приложении HTTP. Атрибуты, применяемые к этой функции, указывают требования к авторизации (анонимные в данном случае) и операции HTTP, к которым отвечает функция (GET и POST).

В следующем примере кода, созданном Visual Studio, проверяется строка запроса, предоставленная как часть URL-адреса для запроса, и ищется параметр name. В коде также используется StreamReader для десериализации текста запроса, и код пытается прочитать значение свойства, также называемого name, из запроса. Если имя найдено в строке запроса или тексте запроса, значение имени возвращается в ответе. В противном случае функция создает ответ на ошибку с сообщением: передайте имя в строке запроса или в тексте запроса.

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");
    }
}

Функция возвращает значение, содержащее выходные данные и результаты, заключенные в объект IActionResult. Значение возвращается в тексте HTTP-ответа на запрос.

Различные типы триггеров получают разные входные параметры и типы возвращаемых значений. В следующем примере показан код, созданный для триггера большого двоичного объекта. В этом примере содержимое большого двоичного объекта возвращается через объект Stream и указывается имя большого двоичного объекта. Триггер не возвращает данные; его цель — считывать и обрабатывать данные в именованном BLOB-объекте.

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
}

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

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

Локальное тестирование приложения-функции Azure

Для локальной сборки и тестирования приложения-функции Azure можно использовать отладчик Visual Studio. Чтобы запустить отладчик, нажмите клавишу F5 или выберите пункт Начать отладку в меню Отладка. Запускается локальная версия среды выполнения функции. Функции доступны для тестирования. В примере показана функция размещения среды выполнения Function1, активируется событием HTTP. URL-адрес указывает конечную точку, к которой в настоящее время присоединена функция.

Снимок экрана: среда выполнения функции Azure (пример 1).

Если вы открываете веб-браузер и посещаете этот URL-адрес, активируете функцию. На рисунке ниже показан ответ, созданный с помощью HTTP-запроса GET, у которого нет текста. Вы увидите сообщение, созданное кодом, которое возвращает объект BadRequestObjectResult из функции.

Снимок экрана: среда выполнения функции Azure.

Если вы предоставляете строку запроса, содержащую параметр имени , функция считывает и обрабатывает значение.

Снимок экрана: среда выполнения функции Azure (пример 2).

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