Руководство. Использование динамической конфигурации в фоновой службе .NET
Данные из Конфигурация приложений можно загрузить в качестве параметров приложения .NET. Дополнительные сведения см. в кратком руководстве. Однако, как и в .NET, параметры приложения могут обновляться только после перезапуска приложения. Поставщик Конфигурации приложений .NET — это библиотека .NET Standard. Она поддерживает динамическое кэширование и обновление конфигурации без перезапуска приложения. В этом руководстве показано, как реализовать динамические обновления конфигурации в фоновой службе .NET.
В этом руководстве описано следующее:
- Настройте фоновую службу .NET для обновления конфигурации в ответ на изменения в хранилище Конфигурация приложений.
- Использование последней конфигурации в фоновой службе.
Необходимые компоненты
- Учетная запись Azure с активной подпиской. Создайте ее бесплатно.
- Хранилище Конфигурация приложений. Создайте хранилище.
- Пакет SDK для .NET версии 6.0 или более поздней версии — также доступен в Azure Cloud Shell.
Добавление ключа-значения
Добавьте следующее ключевое значение в хранилище Конфигурация приложений и оставьте метку и тип контента со значениями по умолчанию. Дополнительные сведения о добавлении значений ключей в хранилище с помощью портал Azure или ИНТЕРФЕЙСА командной строки см. в разделе "Создание значения ключа".
Ключ | Значение |
---|---|
TestApp:Settings:Message | Данные из Конфигурация приложений Azure |
Создание фоновой службы .NET
Интерфейс командной строки .NET (CLI) используется для создания проекта приложения .NET. Преимущество использования .NET CLI по сравнению с Visual Studio заключается в том, что он доступен на платформах Windows, macOS и Linux. Кроме того, можно использовать предварительно установленные средства, доступные в Azure Cloud Shell.
Создайте новый каталог для своего проекта
В новой папке выполните следующую команду, чтобы создать проект фоновой службы .NET:
dotnet new worker
Перезагрузка данных из App Configuration
Добавьте ссылки на
Microsoft.Extensions.Configuration.AzureAppConfiguration
пакет NuGet, выполнив следующую команду:dotnet add package Microsoft.Extensions.Configuration.AzureAppConfiguration
Выполните следующую команду, чтобы восстановить пакеты проекта:
dotnet restore
Откройте файл Program.cs и добавьте следующие инструкции:
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration.AzureAppConfiguration;
Подключитесь к Конфигурация приложений с помощью идентификатора Microsoft Entra (рекомендуется) или строка подключения.
Вы используете
DefaultAzureCredential
для проверки подлинности в хранилище Конфигурация приложений. Следуйте инструкциям, чтобы назначить учетные данные роли чтения данных Конфигурация приложений. Перед запуском приложения обязательно предоставьте достаточно времени для распространения разрешения.// Existing code in Program.cs // ... ... var builder = Host.CreateApplicationBuilder(args); builder.Configuration.AddAzureAppConfiguration(options => { string endpoint = Environment.GetEnvironmentVariable("Endpoint"); options.Connect(new Uri(endpoint), new DefaultAzureCredential()); // Load all keys that start with `TestApp:`. .Select("TestApp:*") // Configure to reload the key 'TestApp:Settings:Message' if it is modified. .ConfigureRefresh(refreshOptions => { refreshOptions.Register("TestApp:Settings:Message"); }); // Register the refresher so that the Worker service can consume it through DI builder.Services.AddSingleton(options.GetRefresher()); }); // The rest of existing code in Program.cs // ... ...
В методе
ConfigureRefresh
для отслеживания изменений регистрируется ключ в хранилище Конфигурации приложений. МетодRegister
имеет необязательный логический параметрrefreshAll
, который можно использовать, чтобы указать, следует ли обновлять все значения конфигурации при изменении зарегистрированного ключа. В этом примере будет обновлен только ключ TestApp:Settings:Message. Срок действия кэша для всех параметров, зарегистрированных для обновления, по умолчанию составляет 30 секунд, а затем предпринимается новая попытка обновления. Его можно обновить, вызвав методAzureAppConfigurationRefreshOptions.SetCacheExpiration
.Откройте Worker.cs. Внедрение и вход
IConfiguration
вWorker
службу иIConfigurationRefresher
ведение журнала данных конфигурации из Конфигурация приложений.public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; private readonly IConfiguration _configuration; private readonly IConfigurationRefresher _refresher; public Worker(ILogger<Worker> logger, IConfiguration configuration, IConfigurationRefresher refresher) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _refresher = refresher ?? throw new ArgumentNullException(nameof(refresher)); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { // Intentionally not await TryRefreshAsync to avoid blocking the execution. _refresher.TryRefreshAsync(stoppingToken); if (_logger.IsEnabled(LogLevel.Information)) { _logger.LogInformation(_configuration["TestApp:Settings:Message"] ?? "No data."); } await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken); } } }
Вызов одного метода
ConfigureRefresh
не приведет к автоматическому обновлению конфигурации. Для активации обновления необходимо вызвать методTryRefreshAsync
из интерфейсаIConfigurationRefresher
. Это позволяет избежать запросов, отправленных в Конфигурация приложений даже если приложение неактивно. Вы можете включить вызовTryRefreshAsync
, в котором вы считаете, что ваше приложение активно. Например, при обработке входящего сообщения, заказа или итерации сложной задачи. Вызовы также могут активироваться по таймеру, если ваше приложение активно все время. В этом примере вы вызываетеTryRefreshAsync
каждый раз, когда выполняется фоновая служба. Обратите внимание, что даже в случае сбоя вызоваTryRefreshAsync
по какой-либо причине ваше приложение продолжит использовать кэшированную конфигурацию. После завершения настроенного времени истечения срока действия кэша будет предпринята еще одна попытка, после чего вызовTryRefreshAsync
будет повторно активирован с помощью действия приложения. ВызовTryRefreshAsync
является холостым до завершения заданного времени истечения срока действия кэша, поэтому его влияние на производительность минимальна, даже если вызов совершается часто.
Создание и запуск приложения локально
Задайте переменную среды.
Задайте переменную среды с именем Endpoint в конечной точке хранилища Конфигурация приложений, найденной в разделе "Обзор хранилища" в портал Azure.
Если вы используете командную строку Windows, выполните следующую команду и перезапустите командную строку, чтобы изменения вступили в силу:
setx Endpoint "<endpoint-of-your-app-configuration-store>"
Если вы используете PowerShell, выполните следующую команду:
$Env:Endpoint = "<endpoint-of-your-app-configuration-store>"
Если вы используете macOS или Linux, выполните следующую команду:
export Endpoint='<endpoint-of-your-app-configuration-store>'
Выполните сборку приложения с помощью приведенной ниже команды.
dotnet build
После успешного завершения сборки выполните следующую команду, чтобы запустить приложение локально.
dotnet run
В консоли должны появиться следующие выходные данные.
На портале Azure перейдите в обозреватель конфигураций хранилища Конфигурации приложений и обновите значение следующего ключа.
Ключ Значение TestApp:Settings:Message Данные из Конфигурация приложений Azure — обновлены Подождите несколько минут, пока интервал обновления истекает. Вы увидите изменения выходных данных консоли.
Очистка ресурсов
Если вы не планируете в дальнейшем использовать ресурсы, созданные при работе с этой статьей, удалите созданную группу ресурсов, чтобы избежать расходов.
Внимание
Удаление группы ресурсов — процесс необратимый. Группа ресурсов и все содержащиеся в ней ресурсы удаляются без возможности восстановления. Будьте внимательны, чтобы случайно не удалить не те ресурсы или группу ресурсов. Если ресурсы для работы с этой статьей созданы в группе ресурсов, которая содержит другие нужные ресурсы, удалите каждый ресурс отдельно в соответствующей области ресурса, чтобы не удалять группу ресурсов.
- Войдите на портал Azure и выберитеГруппы ресурсов.
- Введите имя группы ресурсов в поле Фильтровать по имени.
- В списке результатов выберите имя группы ресурсов, чтобы просмотреть общие сведения.
- Выберите команду Удалить группу ресурсов.
- Подтвердите операцию удаления группы ресурсов. Введите имя группы ресурсов, которую необходимо удалить, и нажмите Удалить.
Через некоторое время группа ресурсов и все ее ресурсы будут удалены.
Следующие шаги
В этом руководстве вы включили фоновую службу .NET для динамического обновления параметров конфигурации из Конфигурация приложений. Чтобы узнать, как включить динамическую конфигурацию в веб-приложении ASP.NET, перейдите к следующему руководству:
Чтобы узнать, как с помощью удостоверения, управляемого Azure, упростить доступ к Конфигурации приложений Azure, перейдите к следующему учебнику: