快速入門:將功能旗標新增至 Azure Functions 應用程式

在本快速入門中,您會建立 Azure Functions C# 程式碼專案並在其中使用功能旗標。 您會使用 Azure 應用程式組態的管理功能來集中儲存所有功能旗標及控制其狀態。

.NET 功能功能管理程式庫可透過功能旗標支援來擴充架構。 這些程式庫會建置在 .NET 組態系統之上。 透過其 .NET 組態提供者與應用程式組態密切整合。

注意

本文目前僅支援在 .NET 6 上執行的 C# 內含式函數應用程式

必要條件

新增功能旗標

將名為 Beta 的功能旗標新增至應用程式組態存放區,並保留標籤描述的預設值。 如需如何使用 Azure 入口網站或 CLI 將功能旗標新增至存放區的詳細資訊,請移至建立功能旗標

啟用名為 Beta 的功能旗標

建立 Functions 專案

Visual Studio 中的 Azure Functions 專案範本會建立可發行至 Azure 中函數應用程式的 C# 類別庫專案。 您可以使用函式應用程式將多個函式群組為邏輯單位,以方便管理、部署、調整和共用資源。

  1. 在 Visual Studio 功能表中,選取 [檔案]> [新增]> [專案]

  2. 在 [建立新專案] 的搜尋方塊中輸入函式,選擇 [Azure Functions] 範本,然後選取 [下一步]

  3. 在 [設定您的新專案] 中,輸入專案的專案名稱,然後選取 [建立]。 函式應用程式名稱必須是有效的 C# 命名空間,因此不會使用底線、連字號或任何其他非英數字元。

  4. 針對 [建立新的 Azure Functions 應用程式] 設定,請使用下表中的值:

    設定 Description
    .NET 版本 .NET 6 此值會建立一個函數專案,執行 Azure Functions 執行階段版本 4.x 的內含式。 如需詳細資訊,請參閱 Azure Functions 執行階段版本概觀
    函式範本 HTTP 觸發程序 此值會建立 HTTP 要求所觸發的函式。
    儲存體帳戶 (AzureWebJobsStorage) 儲存體模擬器 因為 Azure 中的函數應用程式需要儲存體帳戶,所以當您將專案發佈至 Azure 時,就會指派或建立一個儲存體帳戶。 HTTP 觸發程式不會使用 Azure 儲存體帳戶連接字串;所有其他觸發程式類型都需要有效的 Azure 儲存體帳戶連接字串。
    授權等級 匿名 建立的函式可以由任何用戶端觸發,而不需提供金鑰。 此授權設定可以讓測試新函式變得簡單。 如需金鑰和授權的詳細資訊,請參閱 授權金鑰HTTP 和 Webhook 繫結

    Azure Functions 項目設定的螢幕快照


    請確定您已將 [授權層級] 設定為 [匿名]。 如果您選擇函式的預設層級,必須在要求中提供函式金鑰以存取您的函式端點。

  5. 選取 [建立] 以建立函式專案和 HTTP 觸發程序函數。

連線至應用程式組態存放區

此專案將在 .NET Azure Functions 中使用相依性插入。 其會將 Azure 應用程式組態新增為您的功能旗標儲存所在的額外組態來源。

  1. 以滑鼠右鍵按一下專案,然後選取 [管理 NuGet 套件]。 在 [瀏覽] 索引標籤上,搜尋下列 NuGet 套件並新增至您的專案。

  2. 使用下列程式碼,新增 Startup.cs 檔案。 其會定義名為 Startup 的類別,以實作 FunctionsStartup 抽象類別。 元件屬性用來指定 Azure Functions 啟動期間所使用的類型名稱。

    using System;
    using Microsoft.Azure.Functions.Extensions.DependencyInjection;
    using Microsoft.Extensions.Configuration;
    using Microsoft.FeatureManagement;
    
    [assembly: FunctionsStartup(typeof(FunctionApp.Startup))]
    
    namespace FunctionApp
    {
        class Startup : FunctionsStartup
        {
            public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
            {
            }
    
            public override void Configure(IFunctionsHostBuilder builder)
            {
            }
        }
    }
    
  3. 藉由呼叫 AddAzureAppConfiguration(),更新 ConfigureAppConfiguration 方法,並將 Azure 應用程式組態提供者新增為額外的組態來源。

    UseFeatureFlags() 方法會指示提供者載入功能旗標。 在重新檢查變更之前,所有功能旗標的預設快取到期時間均為 30 秒。 設定傳遞給 UseFeatureFlags 方法的 FeatureFlagsOptions.CacheExpirationInterval 屬性,即可更新到期間隔。

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
        {
            options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
                   .Select("_")
                   .UseFeatureFlags();
        });
    }
    

    提示

    如果不想將功能旗標以外的任何組態載入您的應用程式中,您可呼叫 Select("_"),只載入不存在的虛擬機碼 "_"。 根據預設,如果沒有呼叫 Select 方法,就會載入您應用程式組態存放區中的所有組態機碼值。

  4. 更新 Configure 方法,使 Azure 應用程式組態服務和功能管理員可透過相依性插入來提供。

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddAzureAppConfiguration();
        builder.Services.AddFeatureManagement();
    }
    
  5. 開啟 Function1.cs,並新增下列命名空間。

    using System.Linq;
    using Microsoft.FeatureManagement;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    

    新增用於透過相依性插入取得 _featureManagerSnapshotIConfigurationRefresherProvider 執行個體的建構函式。 從 IConfigurationRefresherProvider,您可取得 IConfigurationRefresher 的執行個體。

    private readonly IFeatureManagerSnapshot _featureManagerSnapshot;
    private readonly IConfigurationRefresher _configurationRefresher;
    
    public Function1(IFeatureManagerSnapshot featureManagerSnapshot, IConfigurationRefresherProvider refresherProvider)
    {
        _featureManagerSnapshot = featureManagerSnapshot;
        _configurationRefresher = refresherProvider.Refreshers.First();
    }
    
  6. 更新 Run 方法,以根據功能旗標的狀態變更顯示的訊息值。

    TryRefreshAsync 方法會在 Functions 呼叫的開頭進行呼叫,以重新整理功能旗標。 如果未達到快取到期時間範圍,這就不會有任何作用。 如果您想要在不封鎖目前函式呼叫的情況下重新整理功能旗標,請移除 await 運算子。 在此情況下,較新的函式呼叫將會取得更新的值。

    [FunctionName("Function1")]
    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        await _configurationRefresher.TryRefreshAsync();
    
        string message = await _featureManagerSnapshot.IsEnabledAsync("Beta")
                ? "The Feature Flag 'Beta' is turned ON"
                : "The Feature Flag 'Beta' is turned OFF";
    
        return (ActionResult)new OkObjectResult(message);
    }
    

在本機測試函式

  1. 設定名為 ConnectionString 的環境變數,其值為您先前在應用程式組態存放區中的 [存取金鑰] 下擷取的連接字串。 如果您使用 Windows 命令提示字元,請執行下列命令,然後重新啟動命令提示字元以讓變更生效:

        setx ConnectionString "connection-string-of-your-app-configuration-store"
    

    如果您使用 Windows PowerShell,請執行下列命令:

        $Env:ConnectionString = "connection-string-of-your-app-configuration-store"
    

    如果您使用 macOS 或 Linux,請執行下列命令:

        export ConnectionString='connection-string-of-your-app-configuration-store'
    
  2. 按 F5 測試您的函式。 如果出現提示,請接受 Visual Studio 所發出要下載及安裝 Azure Functions Core (CLI) 工具的要求。 您可能也需要啟用防火牆例外狀況,工具才能處理 HTTP 要求。

  3. 從 Azure Functions 執行階段輸出複製函式的 URL。

    VS 中的快速入門函式偵錯

  4. 將 HTTP 要求的 URL 貼到您的瀏覽器位址列。 下圖顯示的回應指出已停用功能旗標 Beta

    已停用快速入門函式功能旗標

  5. 登入 Azure 入口網站。 選取 [所有資源],然後選取您先前建立的應用程式組態存放區。

  6. 選取 [功能管理員],然後將 Beta 金鑰的狀態變更為 [開啟]

  7. 重新整理瀏覽器數次。 重新整理間隔時間範圍通過時,頁面會變更以指出功能旗 Beta 標已開啟,如下圖所示。

    已啟用快速入門函式功能旗標

注意

本教學課程中使用的範例程式碼,可從 Azure 應用程式組態 GitHub 存放庫下載取得。

清除資源

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

重要

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

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

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

下一步

在本快速入門中,您已建立功能旗標,並透過 Microsoft.FeatureManagement 程式庫將其與 Azure Functions 應用程式搭配使用。