Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Начните работу с SDK Azure WebJobs для Azure App Service чтобы ваши веб-приложения могли выполнять фоновые задачи, запланированные задачи и реагировать на события.
В этом руководстве вы используете Visual Studio 2022, чтобы создать консольное приложение .NET 8, которое использует WebJobs 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 8.0.
Установите пакеты NuGet для WebJobs
Установите последнюю версию пакета NuGet для веб-заданий. Этот пакет включает Microsoft.Azure.WebJobs (SDK для веб-заданий), который позволяет публиковать код функций в веб-задания Azure App Service.
Загрузите последнюю стабильную версию 4.x пакета Microsoft.Azure.WebJobs.Extensions NuGet.
В 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, который работает с различными встроенными и не Microsoft поставщиками ведения журналов.
Получите последнюю стабильную версию пакета
Microsoft.Extensions.Logging.ConsoleNuGet, которая включает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(); } }Он также приводит к следующим изменениям.
- Отключает логирование дашборда. Панель мониторинга — это устаревшее средство мониторинга, а ведение журнала панелей мониторинга не рекомендуется для рабочих сценариев высокой пропускной способности.
- Добавляет поставщика консоли с фильтрацией по умолчанию.
Теперь можно добавить функцию, активированную сообщениями, поступающими в очередь Azure Storage.
Добавление функции
Функция — это единица кода, которая выполняется по расписанию, активируется на основе событий или выполняется по запросу. Триггер прослушивает событие службы. В контексте пакета SDK для веб-заданий триггерный режим не относится к режиму развертывания. Управляемые событиями или запланированные веб-задания, созданные с помощью пакета SDK, всегда должны развертываться в виде непрерывных веб-заданий с включенной функцией Always On .
В этом разделе вы создадите функцию, активированную сообщениями в очереди Azure Storage. Сначала необходимо добавить расширение привязки для подключения к Azure Storage.
Установите расширение привязки хранилища
Начиная с версии 3 пакета SDK для веб-заданий для подключения к службам Azure Storage необходимо установить отдельный пакет расширения привязки хранилища.
Примечание.
Начиная с версии 5.x, Microsoft.Azure.WebJobs.Host.Storageразделяется в соответствии со службой хранилища, и метод расширения AddAzureStorage() переносится на каждый тип службы. Для этой версии также требуется обновить версию сборки 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. Тело метода — это место, где обрабатываются данные триггера. В этом примере код просто записывает сообщение в журнал.
В обозревателе решений (Solution Explorer) щелкните правой кнопкой мыши на проекте, выберите Добавить, затем >, и выберите Класс.
Щелкните правой кнопкой мыши новый файл класса 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 и настроить проект для его использования.
Сведения о создании учетной записи хранилища общего назначения v2 см. в статье Создание учетной записи Azure Storage.
Найдите и скопируйте строку подключения
Для настройки хранилища требуется строка подключения. Сохраните эту строку подключения на следующие шаги.
На портале Azure перейдите к учетной записи хранения и выберите Settings.
В разделе Параметры выберите Ключи доступа.
В разделе Строка подключения для записи key1 щелкните значок Копировать в буфер обмена.
Настройка хранилища для локального запуска
SDK WebJobs ищет строку подключения к хранилищу в параметрах приложения в Azure. При локальном запуске он ищет это значение в локальном файле конфигурации или среди переменных среды.
Щелкните проект правой кнопкой мыши, выберите Добавить>Новый элемент…, выберите Файл конфигурации JSON JavaScript, присвойте новому файлу имя appsettings.json и щелкните Добавить.
В новом файле добавьте поле
AzureWebJobsStorage, как показано в следующем примере:{ "AzureWebJobsStorage": "{storage connection string}" }Замените {storage connection string} строкой подключения, которую вы скопировали ранее.
Выберите файл appsettings.json в Solution Explorer и в окне Properties установите действие Копировать в выходной каталог на Копировать, если более новое.
Так как этот файл содержит секрет connection string, файл не следует хранить в удаленном репозитории кода. После публикации вашего проекта в Azure, вы можете добавить тот же параметр приложения "connection string" в вашем приложении в Azure App Service.
Локальное тестирование.
Чтобы активировать функцию, создайте и запустите проект локально и создайте очередь сообщений.
На портале Azure перейдите к учетной записи хранения и выполните следующие действия.
- Перейдите на вкладку "Очереди" (1).
- Выберите + Очередь (2).
- Введите очередь как Имя очереди (3).
- Нажмите кнопку "ОК " (4).
Выберите новую очередь и нажмите кнопку "Добавить сообщение".
В диалоговом окне Добавить сообщение в очередь введите Hello World! в качестве Текста сообщения, и выберите OK. Теперь в очереди есть сообщение.
Нажмите клавиши CTRL+F5, чтобы запустить проект.
В консоли показано, что среда выполнения обнаружила вашу функцию. Так как вы использовали атрибут
QueueTriggerв функцииProcessQueueMessage, исполняющая среда WebJobs ждет сообщений в очередьqueue. При обнаружении нового сообщения в этой очереди среда выполнения вызывает функцию, передавая ей значение строки сообщения.Вернитесь к окну Очередь и обновите страницу. Сообщение исчезло. Функция, запущенная локально, успешно обработала сообщение.
Закройте окно консоли или введите CTRL+C.
Теперь пришло время опубликовать проект пакета SDK веб-заданий в Azure.
Развертывание в Azure
Во время развертывания создается экземпляр службы приложений, в котором выполняются функции. При публикации консольного приложения .NET в службе приложений в Azure он автоматически запускается в качестве веб-задания. Дополнительные сведения о публикации см. в статье Разработка и деплой WebJobs с помощью Visual Studio.
Создание ресурсов Azure
В Solution Explorer щелкните проект правой кнопкой мыши и выберите Publish.
В диалоговом окне Публикация выберите Azure для Target, а затем нажмите Далее.
Выберите Azure webJobs для целевого объекта Specific и выберите Next.
Выше Экземпляры App Service нажмите кнопку "плюс" (+) для создания нового 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. Этот параметр позволяет хранить connection string более безопасно.
На странице профиля 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
Получите последнюю стабильную версию пакета NuGet Microsoft.Azure.WebJobs.Logging.ApplicationInsights, версии 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 profile actions и выбрать Open на портале Azure.
В веб-приложении в разделе Настройки>Монитор выберите Application Insights и нажмите Просмотреть данные Application Insights.
Выберите Поиск, а затем выберите See all data in the last 24 hours (Просмотреть все данные за последние 24 часа).
Если вы не видите сообщение Hello App Insights!, выберите периодическое обновление в течение нескольких минут. Журналы не появляются немедленно, поскольку клиенту Application Insights требуется время, чтобы сбросить обрабатываемые журналы.
Добавление привязок ввода-вывода.
Привязки упрощают код для чтения и записи данных. Привязка входных данных упрощает код чтения данных. Привязки выходных данных упрощают код записи данных.
Добавить привязки
Привязка входных данных упрощает код чтения данных. В этом примере сообщение очереди — это имя объекта blob, который используется для поиска и чтения объектов blob в 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-объектов в вашей учетной записи хранения.
На портале Azure перейдите на вкладку Containers ниже Data storage и выберите + Контейнер
В диалоговом окне Создать контейнер для имени контейнера введите container, а затем нажмите кнопку Создать.
Отправьте файл Program.cs в контейнер BLOB. (Этот файл используется здесь для примера; вы можете передать любой текстовый файл и создавать сообщение в очереди с его именем.)
Выберите созданный контейнер.
Нажмите кнопку Отправить.
Найдите и выберите файл Program.cs, а затем нажмите кнопку OK.
Повторная публикация проекта
В Solution Explorer щелкните проект правой кнопкой мыши и выберите Publish.
В диалоговом окне Публикация убедитесь, что выбран текущий профиль, а затем щелкните Опубликовать. Подробные результаты публикации выводятся в окно Вывод.
Создайте сообщение в ранее созданной очереди с Program.cs в качестве текста сообщения.
Копия файла copy-Program.cs отображается в контейнере BLOB-объектов.
Следующие шаги
В этом руководстве описано, как создать, запустить и развернуть проект пакета SDK для веб-заданий версии 3.x.