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


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

    Снимок экрана: параметры проекта Функции Azure

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

    Снимок экрана: параметры проекта Функции Azure

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

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

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

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

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

  • 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 никогда не публикуются.

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

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

Среде выполнения Функций Azure необходима учетная запись хранения 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# представляет собой простую функцию для триггеров хранилища очередей:

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

    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: {message.MessageText}");
            }
        }
    }
    

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

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

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

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

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

  1. Нажмите клавишу F5. Если будет предложено, примите запрос от Visual Studio на скачивание и установку основных инструментов решения "Функции Azure" (CLI). Кроме того, возможно, вам понадобиться включить исключение брандмауэра, чтобы инструменты могли обрабатывать HTTP-запросы.

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

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

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

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

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

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

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

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

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

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

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

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

    Снимок экрана: создание экземпляра приложения-функции.

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

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

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

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

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

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

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

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

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

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

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

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

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

Параметры в окне публикации

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

Параметры приложения

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

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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

    Внимание

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

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

    Снимок экрана подключения отладчика из Visual Studio.

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

    Примечание.

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

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

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

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

    Диалоговое окно подключения Visual Studio к процессу

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

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

    Учетные данные для ввода с помощью Visual Studio

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

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

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

    Снимок экрана подключения отладчика из Visual Studio.

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

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

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

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

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

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

Monitor Azure Functions (Мониторинг Функций Azure)

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

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

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

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

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

Тестирование Функций Azure с помощью C# в Visual Studio

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. Отладка тестов

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

Следующие шаги

Об Azure Functions Core Tools см. в статье Работа с Azure Functions Core Tools.