Поделиться через


Разработка Функций Azure с помощью Visual Studio

Visual Studio предоставляет способ разработки, тестирования и развертывания функций библиотеки классов C# в Azure. Если это первый опыт работы с Функциями Azure, ознакомьтесь с общими сведениями о функциях Azure.

Чтобы сразу приступить к работе, рассмотрите возможность выполнения быстрого руководства по функциям для Visual Studio.

В этой статье содержатся подробные сведения об использовании Visual Studio для разработки функций библиотеки классов C# и их публикации в Azure. Существует две модели для разработки функций библиотеки классов C#: изолированной рабочей модели и модели внутрипроцессной.

Вы читаете версию изолированной рабочей модели этой статьи. Вы можете выбрать предпочитаемую модель в верхней части статьи.

Вы читаете черновую версию этой модели статьи. Вы можете выбрать предпочитаемую модель в верхней части статьи.

Если не указано иное, приведенные процедуры и примеры относятся к Visual Studio 2022. Дополнительные сведения о выпусках Visual Studio 2022 см. в заметках о выпуске или заметках о предварительной версии.

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

  • Visual Studio 2022, включая компонент разработки Azure.

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

  • Если у вас нет аккаунта Azure, создайте бесплатную учетную запись перед началом.

Создание проекта Функций Azure

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

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

  2. В диалоговом окне "Создание проекта " введите функции в поле поиска, выберите шаблон "Функции Azure " и нажмите кнопку "Далее".

  3. В диалоговом окне "Настройка нового проекта " введите имя проекта и нажмите кнопку "Далее". Имя приложения-функции должно быть допустимым в качестве пространства имен C#, поэтому не используйте символы подчеркивания, дефисы и другие символы, не являющиеся буквенно-цифровыми.

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

    Настройка Действие Описание
    Рабочая роль Функций Выберите .NET 8.0 (изолированное, долгосрочная поддержка). Visual Studio создает проект функции, который выполняется в изолированном рабочем процессе. Изолированный рабочий процесс также поддерживает другие версии .NET и .NET Framework, которые не предоставляют долгосрочной поддержки (LTS). Дополнительные сведения см. в обзоре версий среды выполнения Функций Azure.
    Function Выберите триггер HTTP. Visual Studio создает функцию, активированную HTTP-запросом.
    Использование Azurite для учетной записи хранения среды выполнения (AzureWebJobsStorage) Установите этот флажок. Поскольку для приложения-функции в Azure требуется учетная запись хранения, она назначается или создается при публикации проекта в Azure. Триггер HTTP не использует строку подключения учетной записи хранилища. Для всех других типов триггеров требуется допустимая строка подключения учетной записи хранения.
    Уровень авторизации Выберите "Анонимный". При использовании этого параметра авторизации любой клиент может активировать созданную функцию без предоставления ключа. Эта конфигурация упрощает тестирование новой функции. Для получения дополнительной информации см. Уровень авторизации.

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

    Настройка Действие Описание
    Рабочая роль Функций Выберите .NET 8.0 внутри процесса (долгосрочная поддержка). Visual Studio создает проект функции, который выполняется в процессе с версией 4.x среды выполнения Функций. Дополнительные сведения см. в обзоре версий среды выполнения Функций Azure.
    Function Выберите триггер HTTP. Visual Studio создает функцию, активированную HTTP-запросом.
    Использование Azurite для учетной записи хранения среды выполнения (AzureWebJobsStorage) Установите этот флажок. Поскольку для приложения-функции в Azure требуется учетная запись хранения, она назначается или создается при публикации проекта в Azure. Триггер HTTP не использует строку подключения учетной записи хранилища. Для всех других типов триггеров требуется допустимая строка подключения учетной записи хранения.
    Уровень авторизации Выберите "Анонимный" При использовании этого параметра авторизации любой клиент может активировать созданную функцию без предоставления ключа. Эта конфигурация упрощает тестирование новой функции. Для получения дополнительной информации см. Уровень авторизации.

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

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

  5. Нажмите кнопку Создать, чтобы создать проект функции и функцию, активируемую с помощью HTTP.

После создания проекта Functions шаблон проекта создает проект на C#, устанавливает пакеты NuGet Microsoft.Azure.Functions.Worker, Microsoft.Azure.Functions.Worker.Sdk и задает целевой фреймворк.

После создания проекта "Функции" шаблон проекта создает проект C#, устанавливает Microsoft.NET.Sdk.Functions пакет NuGet и задает целевую платформу.

Новый проект содержит следующие файлы:

  • host.json. Этот файл предоставляет способ настройки узла функций. Эти параметры применяются как в локальном режиме, так и в Azure. Дополнительные сведения см. в справочной статье о host.json.

  • local.settings.json: этот файл сохраняет параметры, которые используются при локальном запуске функций. Эти параметры не используются при запуске приложения в Azure. Дополнительные сведения см. в разделе "Работа с параметрами приложения" локально.

    Внимание

    Так как файлlocal.settings.json может содержать секреты, его необходимо исключить из системы управления версиями проекта. В диалоговом окне "Свойства" для этого файла убедитесь, что параметр Копировать в выходной каталог имеет значение Копировать, если новее.

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

Для получения дополнительных сведений см. Проект библиотеки классов функций.

Работа с параметрами приложения локально

Когда приложение-функция работает в Azure, параметры, необходимые вашим функциям, хранятся в параметрах приложения. Во время локальной разработки эти параметры добавляются в коллекцию Values вместо этого в файлеlocal.settings.json. Файл local.settings.json также сохраняет параметры, используемые локальными средствами разработки.

Элементы в коллекции в Values файлеlocal.settings.json проекта предназначены для зеркального отображения элементов в параметрах приложения-функции в Azure.

Visual Studio не автоматически отправляет параметры в local.settings.json при публикации проекта. Чтобы эти параметры гарантировано существовали и в приложении-функции в Azure, отправьте их после публикации проекта. Подробнее см. в разделе Параметры приложения-функции. Значения в ConnectionStrings коллекции не публикуются.

Код также может считывать значения параметров приложения-функции как переменные среды. Дополнительную информацию см. в разделе Переменные среды.

Настройка проекта для локальной разработки

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

Для всех типов триггеров, отличных от HTTP и веб-перехватчиков, необходимо задать значение Values.AzureWebJobsStorage ключа в файлеlocal.settings.json :

  • Для учетной записи хранения установите в качестве значения строку подключения вашей учетной записи хранения.
  • Для эмулятора задайте для параметра значение UseDevelopmentStorage=true.

Если вы используете эмулятор, измените этот параметр на фактическую строку подключения учетной записи хранения перед развертыванием. Дополнительные сведения см. в эмуляторе локального хранилища.

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

  1. Войдите на портал Azure и перейдите к учетной записи хранения.

  2. Выберите Безопасность + сеть>Ключи доступа. В разделе key1 скопируйте значение строки подключения .

  3. В проекте Visual Studio откройте файл local.settings.json . Задайте значение AzureWebJobsStorage ключа скопированной строке подключения.

  4. Повторите предыдущий шаг, чтобы добавить уникальные ключи в массив Values для всех других подключений, которые необходимы для функций.

Добавление функции в проект

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

  1. В Обозреватель решений щелкните правой кнопкой мыши узел проекта и выберите > Azure".

  2. В диалоговом окне "Добавить новый элемент" выберите функцию Azure и нажмите кнопку "Добавить".

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

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

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

    • Если выбрать эмулятор хранилища Azurite, откроется страница Подключение к эмулятору хранилища Azurite. Выполните следующие действия.
      1. Нажмите кнопку Далее.
      2. На странице "Сводка изменений" нажмите кнопку "Готово". Visual Studio настраивает зависимость и создает класс триггера.
    • Если выбрать службу хранилища Azure, откроется страница "Подключение к службе хранилища Azure ". Выполните следующие действия.
      1. Выберите учетную запись хранения и нажмите кнопку "Далее". Visual Studio пытается подключиться к учетной записи Azure и получить конечную точку.
      2. Нажмите кнопку Далее.
      3. На странице "Сводка изменений" нажмите кнопку "Готово". Visual Studio настраивает зависимость и создает класс триггера.

    В этом примере триггера используется параметр приложения с ключом, именованным QueueStorage, для подключения к хранилищу. Этот ключ, хранящийся в файлеlocal.settings.json, ссылается на эмулятор Azurite или учетную запись хранения.

  5. Проверьте добавленный класс. Например, следующий класс C# представляет простую функцию триггера хранилища очередей:

    Метод Run() обладает атрибутом Function. Этот атрибут указывает, что метод является точкой входа для функции.

    using System;
    using Azure.Storage.Queues.Models;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Extensions.Logging;
    
    namespace Company.Function;
    
    public class QueueTriggerCSharp
    {
        private readonly ILogger<QueueTriggerCSharp> _logger;
    
        public QueueTriggerCSharp(ILogger<QueueTriggerCSharp> logger)
        {
            _logger = logger;
        }
    
        [Function(nameof(QueueTriggerCSharp))]
        public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")] QueueMessage message)
        {
            _logger.LogInformation("C# Queue trigger function processed: {messageText}", message.MessageText);
        }
    }
    

    Статический Run() метод ассоциируется с FunctionName. Этот атрибут указывает, что метод является точкой входа для функции.

    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    
    namespace Company.Function
    {
        public class QueueTriggerCSharp
        {
            [FunctionName("QueueTriggerCSharp")]
            public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")]string myQueueItem, ILogger log)
            {
                log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            }
        }
    }
    

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

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

  • Параметр имени очереди должен соответствовать имени очереди, используемой на предыдущем шаге для создания триггера, например myqueue-items.
  • Имя параметра строки подключения должно совпадать с именем, используемым на предыдущем шаге для создания триггера, например QueueStorage.

Дополнительные сведения см. в триггере Azure Queue Storage для Azure Functions.

Используйте предыдущую процедуру, чтобы добавить дополнительные функции в проект приложения-функции. Триггеры для функций могут быть разными, но каждая функция в проекте может иметь только один триггер. Дополнительные сведения см. в разделе "Триггеры и привязки функций Azure".

Добавление привязок

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

  1. Убедитесь, что проект настроен для локальной разработки.

  2. Добавьте соответствующий пакет расширения NuGet для каждой конкретной привязки. Чтобы ознакомиться с требованиями к пакету NuGet для конкретного биндинга, смотрите справочную статью по биндингу. Например, требования к пакету для триггера Event Hubs Azure см. в разделе триггера Event Hubs Azure и биндинги для функций Azure.

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

    Install-Package Microsoft.Azure.Functions.Worker.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
    
    Install-Package Microsoft.Azure.WebJobs.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
    

    В этом коде замените <BINDING_TYPE> определенное имя расширения привязки и замените <TARGET_VERSION> определенной версией пакета, например 4.0.0. Допустимые версии перечислены на страницах отдельных пакетов на сайте NuGet.org.

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

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

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

     public class QueueTrigger
    {
        private readonly ILogger _logger;
    
        public QueueTrigger(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<QueueTrigger>();
        }
    
        [Function("CopyQueueMessage")]
        [QueueOutput("myqueue-items-destination", Connection = "QueueStorage")]
        public string Run([QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem)
        {
            _logger.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            return myQueueItem;
        }
    }
    

    Атрибут QueueOutput определяет привязку метода. Для нескольких выходных привязок вместо этого поместите этот атрибут в строковое свойство возвращаемого объекта. Дополнительные сведения см. в разделе "Несколько выходных привязок".

    public static class SimpleExampleWithOutput
    {
        [FunctionName("CopyQueueMessage")]
        public static void Run(
            [QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem, 
            [Queue("myqueue-items-destination", Connection = "QueueStorage")] out string myQueueItemCopy,
            ILogger log)
        {
            log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}");
            myQueueItemCopy = myQueueItem;
        }
    }
    

    Атрибут Queue параметра out определяет выходную привязку.

    Подключение к хранилищу очередей получается из настройки QueueStorage. Дополнительные сведения см. в справочной статье об определённой привязке.

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

Запуск функций локально

Вы можете использовать Core-инструменты Azure Functions для запуска проектов Functions на вашем локальном компьютере разработки. При выборе F5 для отладки проекта функций локальный узел функций (func.exe) начинает прослушивание локального порта (обычно 7071). Любые конечные точки вызываемых функций записываются в выходные данные, и вы можете использовать эти конечные точки для тестирования своих функций. Дополнительные сведения см. в статье "Разработка функций Azure локально с помощью основных средств". Вам будет предложено установить эти инструменты при первом запуске функции из Visual Studio.

Внимание

Начиная с версии 4.0.6517 основных инструментов проекты модели в процессе должны ссылаться на версию 4.5.0 или более поздней версии Microsoft.NET.Sdk.Functions. Если вы используете более раннюю версию, func start команда создает ошибку.

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

  1. Выберите F5. При появлении запроса примите запрос из Visual Studio на скачивание и установку Azure Functions Core Tools. Кроме того, может потребоваться включить исключение брандмауэра, чтобы средства могли обрабатывать HTTP-запросы.

  2. При запуске проекта проверьте код так же, как и развернутую функцию.

    Если Visual Studio работает в режиме отладки, точки останова срабатывают, как ожидалось.

Более подробный сценарий тестирования, использующий Visual Studio, см. в разделе "Тестовые функции" далее в этой статье.

Публикация в Azure

При публикации проекта Функций в Azure Visual Studio использует zip-развертывание для развертывания файлов проекта. По возможности следует также выбрать запуск из файла пакета , чтобы проект выполнялся в пакете развертывания (.zip) . Дополнительные сведения см. в статье "Запуск функций из файла пакета в Azure".

Не развертывайте в Функциях с помощью веб-развертывания (msdeploy).

Чтобы опубликовать проект в приложении-функции в Azure, выполните следующие действия.

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

  2. На странице публикации сделайте следующее:

    • В целевом объекте выберите Azure и нажмите кнопку "Далее".
    • В определенном целевом объекте выберите приложение-функцию Azure и нажмите кнопку "Далее".
    • На экземпляре Функций выберите Создать новый.

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

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

    Настройка значение Описание
    Имя Глобально уникальное имя Имя должно однозначно идентифицировать ваше новое функциональное приложение. Примите предлагаемое имя или введите новое имя. Допустимы следующие символы: a-z, 0-9и -.
    Имя подписки Имя подписки Приложение-функция создается в подписке Azure. Примите подписку по умолчанию или выберите другую из списка.
    Группа ресурсов Имя группы ресурсов Функциональное приложение создается в группе ресурсов. Выберите "Создать" , чтобы создать новую группу ресурсов. Вы также можете выбрать существующую группу ресурсов из списка.
    Тип плана Использование Flex При публикации проекта в функциональное приложение, работающее в плане потребления Flex, вы можете платить только за выполнение функций приложения. Другие планы размещения могут нести более высокие затраты.
    ВАЖНО!
    При создании плана потребления Flex необходимо сначала выбрать план службы приложений , а затем повторно выбрать Flex Consumption , чтобы устранить проблему с диалоговым окном.
    Операционная система Линукс План потребления Flex в настоящее время требует Linux.
    Местонахождение Расположение службы приложений Выберите расположение в регионе Azure, поддерживаемом планом потребления Flex. Если выбран неподдерживаемый регион, кнопка "Создать " неактивна.
    Размер памяти экземпляра 2048 Размер памяти экземпляров виртуальных машин, в которых выполняется приложение, является уникальным для плана потребления Flex.
    Хранилище Azure Учетная запись хранения общего назначения Для среды выполнения функций требуется учетная запись хранения. Выберите Создать, чтобы настроить учетную запись хранения общего назначения. Вы также можете использовать существующую учетную запись, которая соответствует требованиям учетной записи хранения.
    Application Insights Экземпляр Application Insights Необходимо включить интеграцию Application Insights для функционального приложения. Выберите "Создать ", чтобы создать новый экземпляр в новой или существующей рабочей области Log Analytics. Можно также использовать существующий экземпляр.

    Снимок экрана: диалоговое окно создания функционального приложения. Поля для имени, подписки, группы ресурсов, плана и других параметров заполнены.

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

  5. Нажмите Готово. Появится окно создания профиля публикации. После создания профиля нажмите кнопку "Закрыть".

  6. На странице профиля публикации выберите "Опубликовать ", чтобы развернуть пакет, содержащий файлы проекта, в новом приложении-функции в Azure.

    По завершении развертывания корневой URL-адрес приложения-функции в Azure отображается на странице профиля публикации.

  7. На странице профиля публикации перейдите в раздел Хостинг. Выберите многоточие (...), а затем нажмите кнопку "Открыть" на портале Azure. Новый ресурс приложения-функции Azure открывается в портале Azure.

    Скриншот страницы профиля публикации. В разделе

Параметры функционального приложения

Visual Studio не автоматически отправляет параметры приложения при публикации проекта. При добавлении параметров в файл local.settings.json необходимо также добавить их в приложение-функцию в Azure.

Самый простой способ передать необходимые параметры в приложение-функцию в Azure — управлять ими в Visual Studio. На странице профиля публикации перейдите в раздел Хостинг. Выберите многоточие (...), а затем выберите "Управление параметрами службы приложений Azure".

Снимок экрана страницы профиля публикации, раздел

При выборе откроется диалоговое окно параметров приложения для приложения-функции. Это диалоговое окно можно использовать для добавления параметров приложения или изменения существующих.

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

Для каждого параметра локальное значение — это значение в файлеlocal.settings.json , а удаленное значение — это значение в приложении-функции в Azure.

  • Чтобы создать параметр приложения, нажмите кнопку "Добавить".
  • Чтобы скопировать значение параметра из локального поля в удаленное поле, выберите "Вставить значение" из "Локальный".

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

Примечание.

По умолчанию файлlocal.settings.json не проверяется в системе управления версиями. В результате, если клонировать локальный проект Функций из системы управления версиями, проект не имеет local.settings.json файла. Необходимо вручную создать файлlocal.settings.json в корне проекта, чтобы диалоговое окно параметров приложения работало должным образом.

Управление параметрами приложения также можно осуществлять с помощью одного из способов ниже.

Удаленная отладка

Для удаленной отладки приложения-функции необходимо опубликовать конфигурацию отладки своего проекта. Кроме того, необходимо включить удаленную отладку в приложении-функции в Azure.

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

Рекомендации по удаленной отладке

  • Удаленная отладка не рекомендуется для рабочей службы.
  • Чтобы использовать удаленную отладку, необходимо разместить приложение-функцию в плане "Премиум" или "Служба приложений".
  • Удаленная отладка в настоящее время поддерживается только при запуске приложения C# в Windows.
  • Если вы включили функцию Just My Code в Visual Studio, отключите ее. См. инструкции в разделе Включение или отключение функции Just My Code.
  • Избегайте длительных остановов в точках останова при использовании удаленной отладки. Когда процесс останавливается дольше нескольких минут, Azure обрабатывает его как неответственный процесс и завершает работу.
  • При отладке сервер отправляет данные в Visual Studio, что может повлиять на расходы на пропускную способность. Сведения о тарифах пропускной способности см. в калькуляторе цен.
  • Удаленная отладка автоматически отключается в приложении-функции через 48 часов. После этого необходимо включить удаленную отладку.

Подключение отладчика

При отладке изолированного рабочего процесса приложения в настоящее время необходимо подключиться удаленным отладчиком к отдельному процессу .NET. Также требуются несколько других шагов конфигурации.

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

  1. На странице профиля публикации перейдите в раздел Хостинг. Выберите многоточие (...), а затем нажмите кнопку "Подключить отладчик".

    Visual Studio подключается к приложению-функции и включает удаленную отладку, если она еще не включена.

    Примечание.

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

  2. В меню отладки Visual Studio выберите "Присоединить к процессу".

  3. В диалоговом окне "Присоединение к процессу" выполните следующие действия.

    1. Рядом с типом подключения выберите Службы приложений Microsoft Azure.
    2. Рядом с целевым объектом подключения нажмите кнопку "Найти".
  4. В диалоговом окне "Подключение Azure к процессу" найдите и выберите приложение-функцию, а затем нажмите кнопку "ОК".

  5. При появлении запроса разрешите Visual Studio доступ через локальный брандмауэр.

  6. Вернитесь в диалоговое окно "Присоединение к процессу" , выберите "Показать процессы для всех пользователей". Выберите dotnet.exeи нажмите кнопку "Присоединить".

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

После завершения операции вы подключились к коду библиотеки классов C#, работающему в изолированном рабочем процессе. На этом этапе вы можете отлаживать приложение-функцию как обычно.

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

На странице профиля публикации перейдите в раздел Хостинг. Выберите многоточие (...), а затем нажмите кнопку "Подключить отладчик".

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

После завершения отладки необходимо отключить удаленную отладку.

Отключение удаленной отладки

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

  1. На странице профиля публикации перейдите в раздел Хостинг. Выберите многоточие (...), а затем нажмите кнопку "Открыть" на портале Azure. Портал Azure открывается на функциональном приложении, в которое развернут ваш проект.

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

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

Функции мониторинга

Рекомендуемый способ мониторинга функций — интеграция приложения-функции с Application Insights. Эту интеграцию следует включить при создании приложения-функции во время публикации Visual Studio.

Если интеграция не настроена во время публикации по какой-либо причине, необходимо включить интеграцию Application Insights для приложения-функции в Azure.

Дополнительные сведения об использовании Application Insights для мониторинга см. в статье "Мониторинг выполнения" в Функциях Azure.

Тестовые функции

В этом разделе описывается, как создать проект модели в процессе C#, который можно протестировать с помощью xUnit, средства модульного тестирования с открытым исходным кодом для .NET.

Шаг 1. Настройка

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

  1. В Visual Studio создайте проект Функций Azure с именем Functions.

  2. Создайте функцию HTTP из шаблона:

    1. В обозревателе решений щелкните правой кнопкой мыши проект "Функции" и выберите "Добавить>новую функцию Azure".
    2. В диалоговом окне "Добавить новый элемент" выберите функцию Azure и нажмите кнопку "Добавить".
    3. Выберите триггер Http и нажмите кнопку "Добавить".
    4. Переименуйте новый класс MyHttpTrigger.
  3. Создайте функцию таймера из шаблона:

    1. В обозревателе решений щелкните правой кнопкой мыши проект "Функции" и выберите "Добавить>новую функцию Azure".
    2. В диалоговом окне "Добавить новый элемент" выберите функцию Azure и нажмите кнопку "Добавить".
    3. Выберите триггер таймера и нажмите кнопку "Добавить".
    4. Переименуйте новый класс MyTimerTrigger.
  4. Создайте приложение xUnit Test в решении:

    1. В обозревателе решений щелкните правой кнопкой мыши решение, содержащее проект "Функции ", а затем выберите "Добавить>новый проект".
    2. Выберите шаблон проекта тестирования xUnit и нажмите кнопку "Далее".
    3. Назовите проект Functions.Tests.
  5. Удалите тестовые файлы по умолчанию из проекта Functions.Tests .

  6. Используйте NuGet, чтобы добавить ссылку из тестового приложения в Microsoft.AspNetCore.Mvc. Консоль диспетчера пакетов можно использовать, либо можно выполнить следующие действия.

    1. В обозревателе решений щелкните правой кнопкой мыши проект Functions.Tests и выберите пункт "Управление пакетами NuGet".
    2. Найдите и установите Microsoft.AspNetCore.Mvc.
  7. В приложении Functions.Testsдобавьте ссылку на приложение Functions:

    1. В обозревателе решений щелкните правой кнопкой мыши проект Functions.Tests и выберите команду Добавить>ссылку на проект.
    2. Выберите проект "Функции " и нажмите кнопку "ОК".

Шаг 2. Создание тестового класса

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

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

  1. Создайте класс в проекте Functions.Tests с именем NullScope и добавьте следующий код. Этот класс предоставляет фиктивную область. На следующем шаге вы создадите реализацию ILogger , которая использует эту область.

    using System;
    
    namespace Functions.Tests
    {
        public class NullScope : IDisposable
        {
            public static NullScope Instance { get; } = new NullScope();
    
            private NullScope() { }
    
            public void Dispose() { }
        }
    }
    
  2. Создайте класс в проекте Functions.Tests с именем ListLogger и добавьте следующий код. Этот класс поддерживает внутренний список сообщений для оценки во время тестирования. Для реализации требуемого ILogger интерфейса класс использует область макета NullScope из класса. Тестовые случаи передают макетную область в класс ListLogger.

    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Functions.Tests
    {
        public class ListLogger : ILogger
        {
            public IList<string> Logs;
    
            public IDisposable BeginScope<TState>(TState state) => NullScope.Instance;
    
            public bool IsEnabled(LogLevel logLevel) => false;
    
            public ListLogger()
            {
                this.Logs = new List<string>();
            }
    
            public void Log<TState>(LogLevel logLevel,
                                    EventId eventId,
                                    TState state,
                                    Exception exception,
                                    Func<TState, Exception, string> formatter)
            {
                string message = formatter(state, exception);
                this.Logs.Add(message);
            }
        }
    }
    

    Класс ListLogger реализует следующие члены, как определено интерфейсом ILogger:

    • BeginScope: области добавляют контекст в ведение журнала. В этом случае тест указывает на статический экземпляр NullScope класса, чтобы разрешить выполнение теста.
    • IsEnabled: указано значение false по умолчанию.
    • Log: этот метод использует предоставленную formatter функцию для форматирования сообщения. Затем метод добавляет полученный текст в коллекцию Logs .

    Коллекция Logs является экземпляром List<string> и инициализируется в конструкторе.

  3. Создайте файл кода в проекте Functions.Tests с именем LoggerTypes.cs и добавьте следующий код:

    namespace Functions.Tests
    {
        public enum LoggerTypes
        {
            Null,
            List
        }
    }
    

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

  4. Создайте класс в проекте Functions.Tests с именем TestFactory и добавьте следующий код:

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Http.Internal;
    using Microsoft.Extensions.Logging;
    using Microsoft.Extensions.Logging.Abstractions;
    using Microsoft.Extensions.Primitives;
    using System.Collections.Generic;
    
    namespace Functions.Tests
    {
        public class TestFactory
        {
            public static IEnumerable<object[]> Data()
            {
                return new List<object[]>
                {
                    new object[] { "name", "Bernardo" },
                    new object[] { "name", "Ananya" },
                    new object[] { "name", "Vlad" }
    
                };
            }
    
            private static Dictionary<string, StringValues> CreateDictionary(string key, string value)
            {
                var qs = new Dictionary<string, StringValues>
                {
                    { key, value }
                };
                return qs;
            }
    
            public static HttpRequest CreateHttpRequest(string queryStringKey, string queryStringValue)
            {
                var context = new DefaultHttpContext();
                var request = context.Request;
                request.Query = new QueryCollection(CreateDictionary(queryStringKey, queryStringValue));
                return request;
            }
    
            public static ILogger CreateLogger(LoggerTypes type = LoggerTypes.Null)
            {
                ILogger logger;
    
                if (type == LoggerTypes.List)
                {
                    logger = new ListLogger();
                }
                else
                {
                    logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
                }
    
                return logger;
            }
        }
    }
    

    Класс TestFactory реализует следующие элементы.

    • Data: это свойство возвращает коллекцию примеров данных IEnumerable . Пары "ключ-значение" представляют значения, передаваемые в строку запроса.
    • CreateDictionary: этот метод принимает пару "ключ-значение" в качестве аргумента. Он возвращает новый экземпляр Dictionary, который используется для создания экземпляра QueryCollection, представляющего строковые значения запроса.
    • CreateHttpRequest: этот метод создает HTTP-запрос, инициализируемый заданными параметрами строки запроса.
    • CreateLogger: этот метод возвращает реализацию ILogger , используемую для тестирования. Реализация ILogger зависит от указанного типа логгера. Если указан тип списка, ListLogger экземпляр отслеживает зарегистрированные сообщения, доступные для оценки в тестах.
  5. Создайте класс в проекте Functions.Tests с именем FunctionsTests и добавьте следующий код:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    using Xunit;
    
    namespace Functions.Tests
    {
        public class FunctionsTests
        {
            private readonly ILogger logger = TestFactory.CreateLogger();
    
            [Fact]
            public async void Http_trigger_should_return_known_string()
            {
                var request = TestFactory.CreateHttpRequest("name", "Bernardo");
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal("Hello, Bernardo. This HTTP triggered function executed successfully.", response.Value);
            }
    
            [Theory]
            [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
            public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue)
            {
                var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal($"Hello, {queryStringValue}. This HTTP triggered function executed successfully.", response.Value);
            }
    
            [Fact]
            public void Timer_should_log_message()
            {
                var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);
                new MyTimerTrigger().Run(null, logger);
                var msg = logger.Logs[0];
                Assert.Contains("C# Timer trigger function executed at", msg);
            }
        }
    }
    

    Этот класс реализует следующие члены:

    • Http_trigger_should_return_known_string: этот тест использует значение name=Bernardo строки запроса для создания запроса к функции HTTP. Этот тест проверяет, возвращается ли ожидаемый ответ.
    • Http_trigger_should_return_string_from_member_data: этот тест использует атрибуты xUnit для предоставления примеров данных функции HTTP.
    • Timer_should_log_message: этот тест создает экземпляр ListLogger и передает его в функцию таймера. После выполнения функции журнал проверяется, чтобы убедиться, что ожидаемое сообщение присутствует.
  6. Чтобы получить доступ к параметрам приложения в тестах, можно внедрить реализацию IConfiguration с макетными значениями переменных среды в функцию.

Шаг 3. Выполнение тестов

Чтобы запустить тесты в Visual Studio, выберите "Просмотреть>обозреватель тестов". В обозревателе тестов выберите Запустить>все тесты в представлении.

Снимок экрана: Visual Studio. Обозреватель тестов показывает, что прошли пять тестов. В обозревателе решений отображаются проекты Functions и Functions.Test.

Шаг 4. Отладка тестов

Чтобы выполнить отладку тестов, задайте точку останова для теста. В обозревателе тестов выберите "Выполнить отладку>последнего запуска".