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


Разработка Функций 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

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

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

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

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

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

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

    Скриншот параметров проекта Azure Functions для модели изолированного работника.

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

    Снимок экрана параметров проекта Azure Functions для модели в режиме выполнения.

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

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

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

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

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

  • host.json: позволяет настроить хост Functions. Эти параметры применяются как в локальном режиме, так и в 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 никогда не публикуются.

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

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

Функциональная среда выполнения использует учетную запись хранения Azure для внутренних нужд. Для всех типов триггеров, кроме HTTP и веб-перехватчиков, необходимо задать в качестве ключа Values.AzureWebJobsStorage допустимую строку подключения к учетной записи службы хранилища Azure. Функциональное приложение также может использовать эмулятор Azurite для AzureWebJobsStorage параметра подключения, необходимого для проекта. Чтобы использовать эмулятор, присвойте значение AzureWebJobsStorage параметру UseDevelopmentStorage=true. Перед развертыванием в этом параметре необходимо указать действительную строку подключения к учетной записи для хранения данных. Дополнительные сведения см. в эмуляторе локального хранилища.

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

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

  2. На вкладке Ключи доступа под разделом Безопасность и сеть скопируйте строку подключения для key1.

  3. В вашем проекте откройте файлlocal.settings.json и установите значение ключа AzureWebJobsStorage в строку подключения, которую вы скопировали.

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

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

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

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

  2. Введите имя класса и нажмите кнопку "Добавить".

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

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

    Для триггера службы хранилища Azure установите флажок "Настройка подключения", и вам будет предложено выбрать между использованием эмулятора хранилища Azurite или использованием подготовленной учетной записи хранилища Azure. Выберите «Далее», и если вы выберете учетную запись хранения, Visual Studio попытается подключиться к вашей учетной записи Azure и получить строку подключения. Нажмите «Сохранить значение строки подключения в файле секретов локального пользователя», а затем «Готово», чтобы создать класс триггера.

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

  4. Проверьте добавленный класс. Например, следующий класс 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. Дополнительные сведения см. в Привязках хранилища очередей Azure для функции Azure.

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

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

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

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

  2. Добавьте соответствующий пакет расширения NuGet для конкретной привязки (требования к пакету NuGet соответствующей привязки см. в справочной статье). Например, требования к пакету для триггера Центров событий см. в справочной статье о привязках Центров событий.

  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. Добавьте соответствующий атрибут привязки в сигнатуру метода. В следующем примере сообщение очереди активирует функцию, и с помощью выходного связывания создается новое сообщение в другой очереди с таким же текстом.

     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.

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

Основные инструменты службы Функции Azure позволяют запускать проекты функций Azure на локальном компьютере разработчика. При нажатии F5 для отладки проекта Functions локальный хост Functions (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" (CLI). Кроме того, возможно, вам понадобиться включить исключение брандмауэра, чтобы инструменты могли обрабатывать HTTP-запросы.

  2. Запустив проект, протестируйте код, как тестируется развернутая функция.

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

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

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

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

Не развертывайте Azure Functions с помощью Web Deploy (msdeploy).

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

  1. Щелкните правой кнопкой мыши проект в обозревателе решений и выберите пункт Опубликовать. В целевом объекте выберите Azure и нажмите кнопку "Далее".

    Снимок экрана: область публикации.

  2. В определенном целевом объекте выберите приложение-функцию Azure (Windows). Создается приложение-функция, работающее в Windows. Выберите Далее.

    Снимок экрана: область публикации с определенным целевым объектом.

  3. На экземпляре функции выберите Создать новую функцию Azure.

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

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

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

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

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

  6. В экземпляре функции установите флажок "Запуск из пакетного файла". Ваше функциональное приложение развернуто с помощью Zip Deploy при включенном режиме Run-From-Package. Zip Deploy — это рекомендуемый метод развертывания для проекта функций для повышения производительности.

    Снимок экрана: панель завершения создания профиля.

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

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

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

    Снимок экрана: сообщение об успешном публикации.

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

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

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

Снимок экрана: параметры в окне публикации.

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

Снимок экрана: параметры приложения.

Локальный отображает значение параметра в файле local.settings.json и remote отображает текущее значение параметра в приложении-функции в Azure. Чтобы создать параметр приложения, выберите Добавьте параметр. Используйте ссылку Вставка локального значения, чтобы скопировать значение параметра в поле Удаленный. Когда вы нажмете кнопку ОК, ожидающие изменения запишутся в файл с локальными параметрами и приложение-функцию.

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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

    Внимание

    Файл .publishsettings содержит учетные данные (незакодированные), которые используются для администрирования приложения-функции. Рекомендацией по безопасности для этого файла является его временное хранение за пределами исходных каталогов (например, в папке "Библиотеки" или "Документы"), а затем его удаление после того, как он больше не нужен. Злоумышленник, который получает доступ к файлу .publishsettings , может изменять, создавать и удалять ваше функциональное приложение.

  2. Снова на вкладке Публикация выберите многоточие (...) в разделе Размещение, а затем выберите Подключить отладчик.

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

    Примечание.

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

  3. Вернувшись в Visual Studio, скопируйте URL-адрес Сайта в разделе Размещение на странице Публикация.

  4. В меню Отладка выберите Подключить к процессу и в окне Подключение к процессу вставьте URL-адрес в поле Цель подключения, удалите https:// и добавьте порт :4024.

    Убедитесь, что ваша цель выглядит как <FUNCTION_APP>.azurewebsites.net:4024, и нажмите клавишу Ввод.

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

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

  6. При появлении запроса на ввод учетных данных вместо учетных данных локального пользователя выберите другую учетную запись (Больше вариантов в Windows). Укажите значения userName и userPWD из профиля публикации для адреса электронной почты и пароля в диалоговом окне проверки подлинности в Windows. После установки безопасного подключения к серверу развертывания отображаются доступные процессы.

    Снимок экрана: диалоговое окно для ввода учетных данных.

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

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

  • На вкладке Публикация выберите многоточие (...) в разделе Размещение, а затем выберите Подключить отладчик.

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

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

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

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

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

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

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

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

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

Дополнительные сведения о мониторинге с помощью Application Insights см. в статье Мониторинг функций Azure.

Функции тестирования

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

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

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

  1. Создайте новое приложение-функцию и назовите его Functions.
  2. Создайте функцию HTTP на основе шаблона и назовите ее MyHttpTrigger.
  3. Создайте функцию таймера на основе шаблона и назовите ее MyTimerTrigger.
  4. Создайте тестовое приложение xUnit в решении и назовите его Functions.Tests. Удалите тестовые файлы по умолчанию.
  5. С помощью NuGet добавьте ссылку из тестового приложения на Microsoft.AspNetCore.Mvc.
  6. Создайте ссылку на приложение Functions из приложения Functions.Test.

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

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

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

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

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

    using System;
    
    namespace Functions.Tests
    {
        public class NullScope : IDisposable
        {
            public static NullScope Instance { get; } = new NullScope();
    
            private NullScope() { }
    
            public void Dispose() { }
        }
    }
    
  3. Создайте класс в проекте Functions.Tests с именем ListLogger.cs и добавьте следующий код:

    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> и инициализируется в конструкторе.

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

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

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

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

    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", "Bill" },
                    new object[] { "name", "Paul" },
                    new object[] { "name", "Steve" }
    
                };
            }
    
            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: в зависимости от типа средства ведения журнала этот метод возвращает класс средства ведения журнала, используемый для тестирования. ListLogger следит за сообщениями в журнале, доступными для оценки в тестах.

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

    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", "Bill");
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal("Hello, Bill. 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=Bill строки запроса для функции HTTP и проверяет, возвращается ли ожидаемый ответ.

    • Http_trigger_should_return_string_from_member_data: этот тест использует атрибуты xUnit для предоставления примеров данных функции HTTP.

    • Timer_should_log_message: этот тест создает экземпляр ListLogger и передает его в функцию таймера. После выполнения функции журнал будет проверен на наличие ожидаемого сообщения.

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

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

Чтобы запустить тесты, перейдите в обозреватель тестов и выберите Выполнить все тесты в представлении.

Снимок экрана: тестирование функций Azure с помощью C# в Visual Studio.

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

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