共用方式為


教學課程:在 .NET 背景服務中使用動態設定

來自 應用程式組態 的數據可以載入為 .NET 應用程式中的應用程式設定。 如需詳細資訊,請參閱快速入門。 不過,如同 .NET 所設計,應用程式設定只能在應用程式重新啟動時重新整理。 應用程式組態 .NET 提供者為 .NET Standard 程式庫。 其支援動態快取和重新整理設定,而不需重新開機應用程式。 本教學課程說明如何在 .NET 背景服務中實作動態組態更新。

在本教學課程中,您會了解如何:

  • 設定 .NET 背景服務以更新其設定,以回應 應用程式組態 存放區中的變更。
  • 在您的背景服務中取用最新的組態。

必要條件

新增索引鍵/值

將下列索引鍵/值新增至應用程式組態存放區,並保留標籤內容類型的預設值。 如需如何使用 Azure 入口網站或 CLI 將索引鍵/值新增至存放區的詳細資訊,請移至建立索引鍵/值

機碼
TestApp:Settings:Message Azure 應用程式組態的值

建立 .NET 背景服務

您可以使用 .NET 命令列介面 (CLI) 來建立新的 .NET 應用程式專案。 使用 .NET CLI 而非 Visual Studio 的好處,在於 .NET CLI 可同時於 Windows、macOS 及 Linux 平台上取得。 或者,使用 Azure Cloud Shell 中提供的預先安裝工具。

  1. 為您的專案建立新資料夾。

  2. 在新的資料夾中,執行下列命令來建立新的 .NET 背景服務專案:

    dotnet new worker
    

從應用程式設定重新載入資料

  1. 透過執行下列命令,將參考新增至 Microsoft.Extensions.Configuration.AzureAppConfiguration NuGet 套件:

    dotnet add package Microsoft.Extensions.Configuration.AzureAppConfiguration
    
  2. 執行下列命令以還原您專案的套件:

    dotnet restore
    
  3. 開啟 Program.cs,並新增下列陳述式:

    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    
  4. 使用 Microsoft Entra ID 連線到 應用程式組態(建議),或 連接字串。

    您可以使用 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 方法來更新。

  5. 開啟 Worker.cs。 將和 IConfigurationRefresher 插入IConfiguration至服務,Worker並從 應用程式組態 記錄組態數據。

    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 方法並不會導致設定自動重新整理。 您可以從介面 IConfigurationRefresher 呼叫 TryRefreshAsync 方法來觸發重新整理。 即使應用程式閑置,此設計仍可避免傳送至 應用程式組態 的要求。 您可以將 TryRefreshAsync 呼叫包含在您認為使用中的應用程式。 例如,當您在處理內送郵件、訂單或複雜工作的反覆項目時,就可以使用此呼叫。 如果您的應用程式隨時都在作用中,此呼叫也可作為計時器使用。 在這裡範例中,您會在每次執行背景服務時呼叫 TryRefreshAsync 。 請注意,即使呼叫 TryRefreshAsync 因為任何原因而造成失敗,您的應用程式仍會繼續使用快取設定。 當過了設定快取的到期時間之後,而且應用程式活動再次觸發 TryRefreshAsync 呼叫,將會再進行另一次嘗試。 在設定的快取到期時間過去之前,呼叫 TryRefreshAsync 是不可操作的,因此即使頻繁呼叫,其對效能的影響也是最小的。

於本機建置並執行應用程式

  1. 設定環境變數。

    將名為 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>'
    
  2. 執行下列命令以建置應用程式。

    dotnet build
    
  3. 建置成功完成之後,請執行下列命令,在本機執行應用程式。

    dotnet run
    
  4. 您應該會在主控台中看到下列輸出。

    背景服務的螢幕快照。

  5. 在 Azure 入口網站中,瀏覽至您應用程式組態存放區的 [組態總管],並更新下列金鑰的值。

    機碼
    TestApp:Settings:Message Azure 應用程式組態的資料 - 已更新
  6. 請稍候片刻,讓重新整理間隔時間範圍過去。 您會看到主控台輸出已變更。

    重新整理背景服務的螢幕快照。

清除資源

如果您不想繼續使用本文中建立的資源,請刪除在此處建立的資源群組,以避免產生費用。

重要

刪除資源群組是無法回復的動作。 資源群組和其中的所有資源都將被永久刪除。 請確定您不會誤刪錯誤的資源群組或資源。 如果您是在包含需保留其他資源的資源群組內部,建立本文的資源,則可以從每個資源各自的窗格中個別刪除每個資源,而不必刪除整個資源群組。

  1. 登入 Azure 入口網站,然後選取 [資源群組]
  2. 在 [依名稱篩選] 方塊中,輸入您資源群組的名稱。
  3. 在結果清單中,選取資源群組名稱以查看概觀。
  4. 選取 [刪除資源群組]
  5. 系統將會要求您確認是否刪除資源群組。 輸入您資源群組的名稱以進行確認,然後選取 [刪除]

不久後,系統便會刪除該資源群組及其所有的資源。

下一步

在本教學課程中,您已啟用 .NET 背景服務,以動態方式從 應用程式組態 重新整理組態設定。 若要瞭解如何在 ASP.NET Web 應用程式中啟用動態設定,請繼續進行下一個教學課程:

如需了解如何使用 Azure 受控識別簡化存取應用程式組態,請繼續進行下一個教學課程: