Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начните работу с Azure WebJobs SDK для Azure App Service, чтобы ваши веб-приложения могли выполнять фоновые задания, запланированные задачи и реагировать на события.
Используйте Visual Studio 2022, чтобы создать консольное приложение .NET 8, использующее пакет SDK веб-заданий для реагирования на сообщения очереди Azure Storage, локально запустить проект и, наконец, развернуть его в Azure.
В этом учебном пособии вы научитесь, как:
- Создание консольного приложения
- Добавление функции
- Локальное тестирование.
- Развертывание в Azure
- Включить ведение журнала в Application Insights
- Добавление привязок ввода-вывода.
Предварительные условия
Visual Studio 2022 с рабочей нагрузкой для разработки Azure. Install Visual Studio 2022.
Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
Создание консольного приложения
В этом разделе описано, как создать проект в Visual Studio 2022 г. Затем вы добавите средства для разработки с Azure, публикации кода, а также функции, которые прослушивают триггеры и вызывают другие функции. Наконец, вы настроите ведение журнала в консоли, что приведет к отключению устаревшего средства мониторинга и включит провайдера консоли с фильтрацией по умолчанию.
Примечание.
Процедуры, описанные в этой статье, проверяются для создания консольного приложения C#, работающего на .NET 8.0.
Создание проекта
В Visual Studio выберите File>New>Project.
В окне Создание проекта выберите Консольное приложение (C#) и нажмите кнопку Далее.
В окне Настроить новый проект введите имя проекта WebJobsSDKSample и нажмите кнопку Далее.
Выберите Целевую платформу и нажмите Создать. Это руководство проверено с помощью .NET 6.0.
Установите пакеты NuGet для WebJobs
Установите последнюю версию пакета NuGet для веб-заданий. Этот пакет включает Microsoft.Azure.WebJobs (SDK для веб-заданий), который позволяет публиковать ваш код функции в веб-заданиях Azure App Service.
Получите последнюю стабильную версию 4.x пакета NuGet Microsoft.Azure.WebJobs.Extensions.
В Visual Studio перейдите к Tools>NuGet Package Manager.
Выберите консоль Package Manager. Вы увидите список командлетов NuGet, ссылку на документацию и точку входа
PM>.В следующей команде замените
<4_X_VERSION>номером текущей версии, полученной на шаге 1.Install-Package Microsoft.Azure.WebJobs.Extensions -version <4_X_VERSION>Примечание.
Пример кода в этой статье работает с пакетами версии 4.x. Убедитесь, что вы используете версию 4.x, так как при использовании пакетов версии 5.x возникают ошибки сборки.
В консоли Package Manager выполните команду. Появится список расширений, которые будут установлены автоматически.
Создать хост
Хост является контейнером среды выполнения для функций, который прослушивает сигналы от триггеров и вызывает функции. Ниже описано, как создать узел, реализующий IHost, который является универсальным узлом в ASP.NET Core.
Выберите вкладку Program.cs, удалите существующее содержимое и добавьте следующие инструкции
using:using System.Threading.Tasks; using Microsoft.Extensions.Hosting;Также на вкладке Program.cs добавьте следующий код:
namespace WebJobsSDKSample { class Program { static async Task Main() { var builder = new HostBuilder(); builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); }); var host = builder.Build(); using (host) { await host.RunAsync(); } } } }
В ASP.NET Core конфигурации узлов задаются путем вызова методов в экземпляре HostBuilder. Для получения дополнительной информации см. .NET Generic Host. Метод расширения ConfigureWebJobs инициализирует узел WebJobs. В ConfigureWebJobs инициализируйте определенные расширения привязок, например расширение привязки к службе хранилища, и задайте свойства этих расширений.
Включение журналирования консоли
Настройте ведение журнала консоли, использующее платформу ведения журнала ASP.NET Core. Эта платформа, Microsoft.Extensions.Logging, включает в себя API, который работает с различными встроенными и сторонними поставщиками ведения журнала.
Получите последнюю стабильную версию пакета NuGet
Microsoft.Extensions.Logging.Console, которая включает в себяMicrosoft.Extensions.Logging.В следующей команде замените
<9_X_VERSION>номером текущей версии, полученной на шаге 1. Каждый тип пакета NuGet имеет уникальный номер версии.Install-Package Microsoft.Extensions.Logging.Console -version <9_X_VERSION>В консоли Package Manager введите текущий номер версии и выполните команду. Появится список расширений, которые будут установлены автоматически.
На вкладке Program.cs добавьте следующую инструкцию
using:using Microsoft.Extensions.Logging;На той же вкладке Program.cs добавьте метод
ConfigureLoggingвHostBuilderперед командойBuild. МетодAddConsoleдобавляет в конфигурацию ведение журнала консоли.builder.ConfigureLogging((context, b) => { b.SetMinimumLevel(LogLevel.Error); b.AddFilter("Function", LogLevel.Information); b.AddFilter("Host", LogLevel.Debug); b.AddConsole(); });Это добавляет журналирование, которое фиксирует вывод журнала для выполнения функций на уровне
Information, хоста на уровнеDebugи всех остальных компонентов на уровнеerror. МетодMainтеперь выглядит следующим образом:static async Task Main() { var builder = new HostBuilder(); builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); }); builder.ConfigureLogging((context, b) => { b.SetMinimumLevel(LogLevel.Error); b.AddFilter("Function", LogLevel.Information); b.AddFilter("Host", LogLevel.Debug); b.AddConsole(); }); var host = builder.Build(); using (host) { await host.RunAsync(); } }Он также приводит к следующим изменениям.
- Отключает логирование в dashboard. Панель мониторинга — это устаревшее средство мониторинга, поэтому ведение журнала панели мониторинга не рекомендуется в высокопроизводительных сценариях.
- Добавляет поставщика консоли с фильтрацией по умолчанию.
Теперь можно добавить функцию, которая активируется сообщениями, поступающими в очередь Azure Storage.
Добавление функции
Функция — это единица кода, которая выполняется по расписанию, активируется событиями или выполняется по запросу. Триггер прослушивает событие службы. В контексте пакета SDK для веб-заданий триггерный режим не относится к режиму развертывания. Управляемые событиями или запланированные веб-задания, созданные с помощью пакета SDK, всегда должны развертываться как непрерывные веб-задания в режиме Always on.
В этом разделе вы создадите функцию, активированную сообщениями в очереди Azure Storage. Сначала необходимо добавить расширение привязки для подключения к Azure Storage.
Установите расширение привязки хранилища
Начиная с версии 3 пакета SDK для веб-заданий для подключения к службам Azure Storage необходимо установить отдельный пакет расширения привязки хранилища.
Примечание.
Начиная с версии 5.x, Microsoft.Azure.WebJobs.Extensions.Storage разделен по службам хранения и метод расширения был перенесен по типу службы. Для этой версии также требуется обновить версию сборки Microsoft.Azure.WebJobs.Host.Storage, используемой пакетом SDK.
Получите последнюю стабильную версию Microsoft. Azure. WebJobs.Extensions.Storage пакет NuGet версии 5.x.
В следующей команде замените
<5_X_VERSION>номером текущей версии, полученной на шаге 1. Каждый тип пакета NuGet имеет уникальный номер версии.Install-Package Microsoft.Azure.WebJobs.Extensions.Storage -Version <5_X_VERSION>В консоли Package Manager выполните команду с текущим номером версии в точке входа
PM>.Также выполните эту команду, чтобы обновить пакет
Microsoft.Azure.WebJobs.Host.Storageдо версии 4.1.0:Install-Package Microsoft.Azure.WebJobs.Host.Storage -Version 4.1.0В Program.cs, в методе расширения
ConfigureWebJobs, добавьте методAddAzureStorageQueuesв экземплярHostBuilder(перед командойBuild) для инициализации расширения хранилища. На этом этапе методConfigureWebJobsвыглядит следующим образом:builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); b.AddAzureStorageQueues(); });Добавьте приведенный ниже код в метод
Mainпосле создания экземпляраbuilder:builder.UseEnvironment(EnvironmentName.Development);Выполнение в режиме разработки сокращает экспоненциальную задержку опроса очереди, которая может значительно увеличить время, затрачиваемое средой выполнения на поиск сообщения и вызов функции. Удалите эту строку кода или переключитесь в режим
Production, когда завершите разработку и тестирование.Теперь метод
Mainдолжен выглядеть следующим образом:static async Task Main() { var builder = new HostBuilder(); builder.UseEnvironment(EnvironmentName.Development); builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); b.AddAzureStorageQueues(); }); builder.ConfigureLogging((context, b) => { b.SetMinimumLevel(LogLevel.Error); b.AddFilter("Function", LogLevel.Information); b.AddFilter("Host", LogLevel.Debug); b.AddConsole(); }); var host = builder.Build(); using (host) { await host.RunAsync(); } }
Создание функции, активируемой очередью
Атрибут QueueTrigger сообщает среде выполнения вызывать эту функцию, когда новое сообщение записывается в очередь Azure Storage с именем queue. Содержимое сообщения в очереди передается коду метода в параметре message. Тело метода — это место, где обрабатываются данные триггера. В этом примере код просто записывает сообщение в журнал.
В обозревателе решений щелкните правой кнопкой мыши на проекте, выберите Добавить>Новый элемент, а затем выберите Класс.
Щелкните правой кнопкой мыши новый файл класса C# Functions.cs и выберите Добавить.
В файле Functions.cs замените созданный шаблон следующим кодом:
using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; namespace WebJobsSDKSample { public static class Functions { public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger) { logger.LogInformation(message); } } }Класс Functions нужно пометить как
public static, чтобы метод был доступен для среды выполнения. В приведенном выше примере кода при добавлении сообщения в очередьqueueфункция выполняется и строкаmessageзаписывается в журналы. Отслеживаемая очередь находится в учетной записи Azure Storage по умолчанию, которую вы создаете следующим образом.
Параметр message не должен быть строкой. Также можно выполнить привязку к объекту JSON, массиву байтов или CloudQueueMessage.
См. "Использование триггера очереди". Каждый тип привязки (например, очереди, BLOB-объекты или таблицы) обладает своим набором типов параметров привязки.
Создание учетной записи хранения Azure
Эмулятор Azure Storage, работающий локально, не имеет всех функций, необходимых пакету SDK для веб-заданий. Вы создадите учетную запись хранения в Azure и настроите проект для его использования.
Сведения о создании учетной записи хранения общего назначения версии 2 см. в статье Создание учетной записи Azure Storage.
Найдите и скопируйте строку подключения
Для настройки хранилища требуется connection string. Сохраните эту строку подключения для следующих шагов.
На портале Azure перейдите к учетной записи хранения и выберите Settings.
В разделе Параметры выберите Ключи доступа.
В разделе Строка подключения для записи key1 щелкните значок Копировать в буфер обмена.
Настройка хранилища для локального запуска
Пакет SDK для веб-заданий ищет строку подключения к хранилищу данных в параметрах приложения в Azure. При локальном запуске он ищет это значение в локальном файле конфигурации или среди переменных среды.
Щелкните проект правой кнопкой мыши, выберите Добавить>Новый элемент…, выберите Файл конфигурации JSON JavaScript, присвойте новому файлу имя appsettings.json и щелкните Добавить.
В новом файле добавьте поле
AzureWebJobsStorage, как показано в следующем примере:{ "AzureWebJobsStorage": "{storage connection string}" }Замените {строка подключения к хранилищу} строкой подключения, которую вы скопировали ранее.
Выберите файл appsettings.json в Solution Explorer и в окне Properties задайте действие Копировать в выходной каталог как Копировать, если более новое.
Так как этот файл содержит секрет connection string, файл не следует хранить в удаленном репозитории кода. После публикации проекта в Azure вы можете добавить в Azure App Service тот же параметр приложения connection string.
Локальное тестирование.
Выполните сборку и запустите проект локально. Создайте очередь сообщений для активации функции.
На портале Azure перейдите к учетной записи хранения и выберите вкладку Queues (1). Щелкните + Очередь (2) и введите queue в качестве имени очереди (3). Нажмите кнопку ОК (4).
Щелкните новую очередь и выберите Добавить сообщение.
В диалоговом окне Add Message введите Hello World! в качестве текста и выберите OK. В очереди есть новое сообщение.
Нажмите клавиши CTRL+F5, чтобы запустить проект.
В консоли показано, что среда выполнения обнаружила вашу функцию. Так как вы использовали атрибут
QueueTriggerв функцииProcessQueueMessage, исполняющая среда WebJobs ждет сообщений в очередьqueue. При обнаружении нового сообщения в этой очереди среда выполнения вызывает функцию, передавая ей значение строки сообщения.Вернитесь к окну Очередь и обновите страницу. Сообщение исчезнет, так как оно уже обработано функцией, выполняемой локально.
Закройте окно консоли или введите CTRL+C.
Теперь пришло время опубликовать проект пакета SDK веб-заданий в Azure.
Развертывание в Azure
В процессе развертывания создается экземпляр службы приложений, в котором будут выполняться ваши функции. При публикации консольного приложения .NET в службе приложений в Azure он автоматически запускается в качестве веб-задания. Чтобы узнать больше о публикации, см. статью Разработка и развертывание WebJobs с помощью Visual Studio.
Создание ресурсов Azure
В Solution Explorer щелкните проект правой кнопкой мыши и выберите Publish.
В диалоговом окне Публикация выберите Azure для Цель, а затем выберите Далее.
Выберите Azure webJobs для целевого объекта Specific и выберите Next.
Над Экземплярами службы App нажмите кнопку "плюс" (+), чтобы создать новый Azure WebJob.
В диалоговом окне App Service (Windows) используйте параметры размещения в следующей таблице.
Настройка Предлагаемое значение Описание: Имя Глобально уникальное имя Имя, которое однозначно идентифицирует новое функциональное приложение. Subscription Выберите свою подписку Используемая подписка Azure. Группа ресурсов myResourceGroup Имя группы ресурсов, в которой создается приложение-функция. Выберите "Создать" , чтобы создать новую группу ресурсов. План размещения План службы приложений План службы приложений указывает расположение, размер и функции фермы веб-серверов, в которой размещается приложение. Вы можете сэкономить средства при размещении нескольких приложений, настроив совместное использование одного плана службы приложений в веб-приложениях. Планы службы приложений определяют регион, размер экземпляра, степень масштабирования и SKU ("Бесплатный", "Общий", "Базовый", "Стандартный" или "Премиум"). Выберите Создать, чтобы создать новый план службы приложений Уровни "Бесплатный" и "Базовый" не поддерживают функцию Always On, чтобы обеспечить непрерывную работу сайта.
Выберите Create, чтобы создать веб-задание и связанные ресурсы в Azure с этими параметрами и развернуть код проекта.
Чтобы вернуться на страницу Публикация, выберите Готово.
Включить Always On
Для непрерывного веб-задания на сайте следует включить параметр Always on, чтобы ваши веб-задания выполнялись правильно. Если не включить режим Always on, среда выполнения будет переходить в состояние простоя после нескольких минут бездействия.
На странице Publish выберите три точки над Hosting, чтобы отобразить действия в секции профиля хостинга и выбрать Открыть на портале Azure.
В окне Параметры выберите Конфигурация>Общие настройки, задайте для параметра Always on значение Включено, после чего щелкните Сохранить и Продолжить, чтобы перезапустить сайт.
Публикация проекта
С помощью веб-приложения, созданного в Azure, пришло время опубликовать проект WebJobs.
На странице Публикация в разделе Размещение нажмите кнопку "Изменить" и измените Тип веб-задания на
Continuous, затем нажмите кнопку Сохранить. Это гарантирует, что веб-задание будет выполняться при добавлении сообщений в очередь. Триггерные веб-задания обычно используются только для ручных веб-хуков.
Нажмите кнопку Опубликовать в правом верхнем углу страницы Публикация. Когда операция завершится, веб-задание выполняется в Azure.
Создание параметра приложения для подключения к хранилищу
Необходимо создать в Azure ту же строку подключения хранилища, что и в локальном файле конфигурации appsettings.json. Это позволяет более безопасно хранить строку подключения и
На странице профиля Publish выберите три точки над Hosting, чтобы отобразить действия раздела профиля Hosting и выберите пункт Управление настройками Azure App Service.
В разделе Параметры приложения выберите Добавить параметр.
В окне Имя нового параметра приложения введите
AzureWebJobsStorageи нажмите кнопку ОК.В Remote вставьте connection string из локального параметра и выберите OK.
Теперь строка подключения устанавливается в приложении на платформе Azure.
Активация функции в Azure
Убедитесь, что вы не работаете локально. Закройте окно консоли, если оно все еще открыто. В противном случае локальный экземпляр может первым начать обрабатывать создаваемые вами сообщения в очереди.
На странице Queue в Visual Studio добавьте сообщение в очередь, как и раньше.
Обновите страницу Queue, а новое сообщение исчезнет, так как оно обработано функцией, запущенной в Azure.
Включить ведение журнала в Application Insights
Когда веб-задание выполняется в Azure, вы не можете отслеживать выполнение функции, просматривая выходные данные консоли. Чтобы иметь возможность отслеживать веб-задание, при публикации проекта следует создать связанный экземпляр Application Insights.
Создайте экземпляр Application Insights
На странице профиля Publish Выберите три точки над Hosting, чтобы отобразить действия раздела профиля Hosting profile actions и выбрать Open на портале Azure.
В веб-приложении в разделе "Мониторинг" выберите Application Insights и выберите "Включить Application Insights".
Проверьте созданное имя ресурса для экземпляра и расположения, а затем нажмите кнопку "Применить " и " Да".
В разделе "Параметры" выберите переменные среды и убедитесь, что создан новый
APPINSIGHTS_INSTRUMENTATIONKEYобъект. Этот ключ используется для подключения экземпляра веб-задания к Application Insights.
Чтобы воспользоваться преимуществами ведения журнала Application Insights, нужно также обновить код ведения журнала.
Установите расширение Application Insights
Получите последнюю стабильную версию Microsoft. Azure. WebJobs.Logging.ApplicationInsights пакет NuGet версии 3.x.
В следующей команде замените
<3_X_VERSION>номером текущей версии, полученной на шаге 1. Каждый тип пакета NuGet имеет уникальный номер версии.Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights -Version <3_X_VERSION>В консоли Package Manager выполните команду с текущим номером версии в точке входа
PM>.
Инициализация провайдера логирования Application Insights
Откройте файл Program.cs и добавьте приведенный ниже инициализатор в ConfigureLogging после вызова AddConsole:
// If the key exists in settings, use it to enable Application Insights.
string instrumentationKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
if (!string.IsNullOrEmpty(instrumentationKey))
{
b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
}
Теперь код метода Main должен выглядеть следующим образом:
static async Task Main()
{
var builder = new HostBuilder();
//builder.UseEnvironment(EnvironmentName.Development);
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorageQueues();
});
builder.ConfigureLogging((context, b) =>
{
b.SetMinimumLevel(LogLevel.Error);
b.AddFilter("Function", LogLevel.Information);
b.AddFilter("Host", LogLevel.Debug);
b.AddConsole();
// If the key exists in settings, use it to enable Application Insights.
string? instrumentationKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
if (!string.IsNullOrEmpty(instrumentationKey))
{
b.AddApplicationInsightsWebJobs(o => o.InstrumentationKey = instrumentationKey);
}
});
var host = builder.Build();
using (host)
{
await host.RunAsync();
}
}
Это действие позволит инициализировать поставщик журнала Application Insights с фильтрацией по умолчанию. При локальном выполнении вся информация и журналы более высокого уровня выводятся как в консоль, так и в Application Insights. При локальном запуске ведение журнала Application Insights поддерживается только после добавления APPINSIGHTS_INSTRUMENTATIONKEY в файл appsetting.json в проекте.
Повторная публикация проекта и активация функции
В Solution Explorer щелкните проект правой кнопкой мыши и выберите Publish.
Как и раньше, используйте портал Azure для создания сообщения очереди, как вы сделали ранее, за исключением ввода Hello App Insights! в качестве текста сообщения.
На странице профиля Publish выберите три точки над Hosting, чтобы отобразить действия в разделе профиля Hosting и выбрать Открыть в портале Azure.
В веб-приложении в разделе Настройки>Монитор выберите Application Insights и нажмите Просмотреть данные Application Insights.
Выберите Поиск, а затем выберите See all data in the last 24 hours (Просмотреть все данные за последние 24 часа).
Если вы не видите сообщение Hello App Insights!, выберите периодическое обновление в течение нескольких минут. Журналы не появляются немедленно, поскольку клиенту Application Insights требуется время, чтобы сбросить обрабатываемые журналы.
Добавление привязок ввода-вывода.
Привязки упрощают код для чтения и записи данных. Привязка входных данных упрощает код чтения данных. Привязки выходных данных упрощают код записи данных.
Добавить привязки
Привязка входных данных упрощает код чтения данных. В этом примере сообщение очереди — это имя большого двоичного объекта, который будет использоваться для поиска и чтения большого двоичного объекта в Azure Storage. Позже вы будете использовать выходные привязки для записи копии файла в тот же контейнер.
В Functions.cs добавьте
using:using System.IO;Замените метод
ProcessQueueMessageследующим кодом:public static void ProcessQueueMessage( [QueueTrigger("queue")] string message, [Blob("container/{queueTrigger}", FileAccess.Read)] Stream myBlob, [Blob("container/copy-{queueTrigger}", FileAccess.Write)] Stream outputBlob, ILogger logger) { logger.LogInformation($"Blob name:{message} \n Size: {myBlob.Length} bytes"); myBlob.CopyTo(outputBlob); }В этом коде
queueTrigger— это выражение привязки, что означает, что его значение определяется во время выполнения. Во время выполнения оно содержит сообщение в очереди.Этот код использует выходные привязки для создания копии файла, определенного сообщением очереди. Копия файла имеет префикс copy-.
На вкладке Program.cs в метод расширения
ConfigureWebJobsдобавьте методAddAzureStorageBlobsдля экземпляраHostBuilder(перед командойBuild), чтобы инициализировать расширение службы хранилища. На этом этапе методConfigureWebJobsвыглядит следующим образом:builder.ConfigureWebJobs(b => { b.AddAzureStorageCoreServices(); b.AddAzureStorageQueues(); b.AddAzureStorageBlobs(); });Создайте контейнер для BLOB-объектов в вашей учетной записи хранения.
a. На портале Azure перейдите на вкладку Containers ниже Data storage и выберите + Контейнер
b. В диалоговом окне Создать контейнер для имени контейнера введите container, а затем нажмите кнопку Создать.
Отправьте файл Program.cs в контейнер BLOB. (Этот файл используется здесь для примера; вы можете передать любой текстовый файл и создавать сообщение в очереди с его именем.)
a. Выберите созданный контейнер.
b. Нажмите кнопку Отправить.
c. Найдите и выберите файл Program.cs, а затем нажмите кнопку OK.
Повторная публикация проекта
В Solution Explorer щелкните проект правой кнопкой мыши и выберите Publish.
В диалоговом окне Публикация убедитесь, что выбран текущий профиль, а затем щелкните Опубликовать. Подробные результаты публикации выводятся в окно Вывод.
Создайте сообщение в ранее созданной очереди с Program.cs в качестве текста сообщения.
Копия файла copy-Program.cs появится в BLOB-контейнере.
Следующие шаги
В этом руководстве описано, как создать, запустить и развернуть проект пакета SDK для веб-заданий версии 3.x.