教學課程:開始使用 Azure WebJobs SDK 進行事件驅動背景處理

開始使用適用於 Azure App 服務的 Azure WebJobs SDK,讓 Web 應用程式能夠執行背景工作、排程的工作,以及回應事件。

使用 Visual Studio 2022 建立 .NET Core 主控台應用程式,該應用程式會使用 WebJobs SDK 來回應 Azure 儲存體佇列訊息、在本地執行專案,最後將其部署至 Azure。

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

  • 建立主控台應用程式
  • 新增函式
  • 在本機進行測試
  • 部署至 Azure
  • 啟用 Application Insights 記錄
  • 新增輸入/輸出繫結

必要條件

建立主控台應用程式

在本節中,您會從在 Visual Studio 2022 建立專案開始。 接下來,您將新增 Azure 開發、程式碼發佈和接聽觸發程序和呼叫函數的工具。 最後,您將設定主控台記錄,以停用舊版監視工具,並啟用具有預設篩選功能的主控台提供者。

注意

本文中的程序經過驗證,以建立在 .NET 6.0 上執行的 .NET Core 主控台應用程式。

建立專案

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

  2. 在 [建立新專案] 上,選取 [主控台應用程式 (C#)],然後選取 [下一步]

  3. 在 [設定新專案] 下,將專案命名為 WebJobsSDKSample,然後選取 [下一步]

  4. 選擇目標架構,然後選取 [建立]。 已使用 .NET 6.0 驗證本教學課程。

安裝 WebJobs NuGet 套件

安裝最新的 WebJobs NuGet 套件。 此套件包含 Microsoft.Azure.WebJobs (WebJobs SDK),可讓您將函數程式碼發佈至 Azure App Service 中的 WebJobs。

  1. 取得 Microsoft.Azure.WebJobs.Extensions.Storage NuGet 套件的最新穩定 4.x 版。

  2. 在 Visual Studio 中,移至 [工具]> [NuGet 套件管理員]

  3. 選取 [套件管理員主控台]。 您會看到一份 NuGet Cmdlet 清單、文件連結和 PM> 進入點。

  4. 在下列命令中,以您在步驟 1 中找到的目前版本號碼取代 <4_X_VERSION>

    Install-Package Microsoft.Azure.WebJobs.Extensions -version <4_X_VERSION>
    
  5. 在 [套件管理員主控台] 中執行此命令。 延伸模組清單隨即出現,並會自動安裝。

建立主機

主機是函式執行階段容器,其會接聽觸發程序及呼叫函式。 下列步驟會建立實作 IHost 的主機,其是 ASP.NET Core 中的泛型主機。

  1. 選取 [Program.cs] 索引標籤,移除現有內容,並新增下列 using 陳述式:

    using System.Threading.Tasks;
    using Microsoft.Extensions.Hosting;
    
  2. 此外,在 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 泛型主機ConfigureWebJobs 擴充方法會初始化 WebJobs 主機。 在 ConfigureWebJobs 中,初始化特定的繫結延伸模組,例如儲存體繫結延伸模組,以及這些延伸模組的設定屬性。

啟用主控台記錄

設定使用 ASP.NET Core 紀錄架構的主控台記錄。 此架構 Microsoft.Extensions.Logging 包含的 API 可與各種內建和協力廠商記錄提供者搭配使用。

  1. 取得 Microsoft.Extensions.Logging.Console NuGet 套件的最新穩定版本,其中包含 Microsoft.Extensions.Logging

  2. 在下列命令中,以您在步驟 1 中找到的目前版本號碼取代 <6_X_VERSION>。 每個類型的 NuGet Package 都有唯一的版本號碼。

    Install-Package Microsoft.Extensions.Logging.Console -version <6_X_VERSION>
    
  3. 套件管理員主控台中,填入目前的版本號碼並執行命令。 延伸模組清單隨即出現,並會自動安裝。

  4. [Program.cs] 索引標籤下,新增此 using 陳述式:

    using Microsoft.Extensions.Logging;
    
  5. Program.cs 下繼續,在 Build 命令之前將 ConfigureLogging 方法新增至 HostBuilderAddConsole 方法會將主控台記錄新增至組態。

    builder.ConfigureLogging((context, b) =>
    {
        b.AddConsole();
    });
    

    Main 方法現在如下所示:

    static async Task Main()
    {
        var builder = new HostBuilder();
        builder.ConfigureWebJobs(b =>
                {
                    b.AddAzureStorageCoreServices();
                });
        builder.ConfigureLogging((context, b) =>
                {
                    b.AddConsole();
                });
        var host = builder.Build();
        using (host)
        {
            await host.RunAsync();
        }
    }
    

    這項新增動作會進行下列變更:

    • 停用儀表板記錄。 儀表板是舊版監視工具,而且不建議將儀表板記錄用於高輸送量的生產案例。
    • 透過預設篩選新增主控台提供者。

現在您可以新增函式,此函式是由抵達 Azure 儲存體佇列的訊息觸發。

新增函式

函數是依排程執行、根據事件觸發或視需要執行的程式碼單位。 觸發程序會接聽服務事件。 在 WebJobs SDK 的內容中,觸發的項目不會參考部署模式。 使用 SDK 建立的事件驅動或排程 WebJobs 應該一律部署為已啟用「Always On」的連續 WebJobs。

在本節中,您會在 Azure 儲存體佇列中建立由訊息觸發的函數。 首先,您必須新增繫結延伸模組以連線至 Azure 儲存體。

安裝儲存體繫結延伸模組

從 WebJobs SDK 第 3 版開始,若要連線到 Azure 儲存體服務,您必須安裝個別的儲存體繫結延伸模組套件。

注意

從 5.x 開始,Microsoft.Azure.WebJobs.Extensions.Storage 已依儲存體服務分割,並已依服務類型移轉 AddAzureStorage() 延伸模組方法。

  1. 取得 Microsoft.Azure.WebJobs.Extensions.Storage NuGet 套件 5.x 版的最新穩定版本。

  2. 在下列命令中,以您在步驟 1 中找到的目前版本號碼取代 <5_X_VERSION>。 每個類型的 NuGet Package 都有唯一的版本號碼。

    Install-Package Microsoft.Azure.WebJobs.Extensions.Storage -Version <5_X_VERSION>
    
  3. 套件管理員主控台中,在 PM> 進入點執行具有目前版本號碼的命令。

  4. Program.cs 中,在 ConfigureWebJobs 擴充方法中,在 HostBuilder 執行個體上新增 AddAzureStorageQueues 方法 (在 Build 命令之前),以初始化儲存體延伸模組。 此時,ConfigureWebJobs 方法如下列所示:

    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddAzureStorageQueues();
    });
    
  5. builder 具現化之後,在 Main 方法中新增下列程式碼:

    builder.UseEnvironment(EnvironmentName.Development);
    

    開發模式中執行可減少佇列輪詢指數輪詢,這可大幅延遲執行階段尋找訊息並叫用函數所花費的時間。 當您完成開發和測試時,應該移除這一行程式碼或切換至 Production

    Main 方法現在看起來應該如下列範例所示:

    static async Task Main()
    {
        var builder = new HostBuilder();
        builder.UseEnvironment(EnvironmentName.Development);
        builder.ConfigureLogging((context, b) =>
        {
            b.AddConsole();
        });
        builder.ConfigureWebJobs(b =>
        {
            b.AddAzureStorageCoreServices();
            b.AddAzureStorageQueues();
        });
        var host = builder.Build();
        using (host)
        {
            await host.RunAsync();
        }
    }
    

建立由佇列觸發的函式

QueueTrigger 屬性會告知執行階段當名為 queue 的 Azure 儲存體佇列上有新訊息寫入時,請呼叫此函式。 佇列訊息的內容會提供給 message 參數中的方法程式碼。 方法的主體是您處理觸發程序資料的地方。 在此範例中,程式碼只會記錄訊息。

  1. 在 [方案總管] 中,以滑鼠右鍵按一下專案,選取 [新增]> [新項目],然後選取 [類別]

  2. 將新的 C# 類別檔案命名為 Functions.cs,並選取 [新增]

  3. Functions.cs 中,以下列程式碼取代產生的範本:

    using Microsoft.Azure.WebJobs;
    using Microsoft.Extensions.Logging;
    
    namespace WebJobsSDKSample
    {
        public class Functions
        {
            public static void ProcessQueueMessage([QueueTrigger("queue")] string message, ILogger logger)
            {
                logger.LogInformation(message);
            }
        }
    }
    

    您應該將 Functions 類別標示為 public static,讓執行階段存取和執行方法。 在上述程式碼範例中,當訊息新增至名為 queue 的佇列時,函數便會執行,並將 message 字串寫入記錄。 受監視的佇列位於您接下來建立的預設 Azure 儲存體帳戶中。

message 參數不必是字串。 您也可以繫結至 JSON 物件、位元組陣列或 CloudQueueMessage 物件。 請參閱佇列觸發程序使用方式。 每個繫結類型 (例如佇列、blob 或資料表) 都有一組您可以繫結至的不同參數類型。

建立 Azure 儲存體帳戶

在本地執行的 Azure 儲存體模擬器沒有 WebJobs SDK 所需的全部功能。 您會在 Azure 中建立儲存體帳戶,並設定專案來加以使用。

若要瞭解如何建立一般用途第 2 版儲存體帳戶,請參閱建立 Azure 儲存體帳戶

尋找並複製連接字串

需要連接字串才可設定儲存體。 保留此連接字串以進行下一步。

  1. Azure 入口網站中,瀏覽至儲存體帳戶,然後選取 [設定]

  2. 在 [設定] 中,選取 [存取金鑰]

  3. 針對 key1 下的 [連接字串],選取 [複製到剪貼簿] 圖示。

    key

設定儲存體在本機執行

WebJobs SDK 會在 Azure 中的 [應用程式設定] 尋找儲存體連接字串。 當您在本機執行時,它會在組態檔或環境變數中尋找此值。

  1. 以滑鼠右鍵按一下專案,選取 [新增]> [新增項目],選取 [JavaScript JSON 設定檔],將新檔案命名為 appsettings.json,然後選取 [新增]

  2. 在新檔案中新增 AzureWebJobsStorage 欄位,如下列範例所示:

    {
        "AzureWebJobsStorage": "{storage connection string}"
    }
    
  3. 使用您先前複製的連接字串取代 {儲存體連接字串}

  4. 選取方案總管中的 appsettings.json 檔案,然後在 [屬性] 視窗中,將 [複製到輸出目錄] 動作設定為 [如果較新則複製]

因為此檔案包含連接字串祕密,所以您不應該將檔案儲存在遠端程式碼存放庫中。 將專案發佈至 Azure 之後,您可以在應用程式中於 Azure App Service 中新增相同的連接字串應用程式設定。

在本機進行測試

在本地建置並執行專案,並建立訊息佇列以觸發函數。

  1. 在Azure 入口網站中,瀏覽至您的儲存體帳戶,然後選取 [佇列] 索引標籤 (1)。 選取 [+ 佇列] (2),然後輸入 queue 做為佇列名稱 (3)。 然後選取 [確定] (4)。

    This image shows how to create a new Azure Storage Queue.

  2. 按一下新的佇列,然後選取 [新增訊息]

  3. 在 [新增訊息] 對話方塊中,輸入 Hello World! 做為訊息文字,然後選取 [確定]。 佇列中現在會有一則訊息。

    Create queue

  4. Ctrl+F5 執行專案。

    此主控台會顯示執行階段發現您的函數。 您在 ProcessQueueMessage 函數中使用 QueueTrigger 屬性,因此 WebJobs 執行階段會接聽名為 queue 之佇列中的訊息。 當其在此佇列中找到新的訊息時,執行階段會呼叫函數,並傳入訊息字串值。

  5. 返回 [佇列] 視窗,然後重新整理。 訊息已消失,因為訊息已由您在本機執行的函式處理。

  6. 關閉主控台視窗。

現在是時候將 WebJobs SDK 專案發佈至 Azure 了。

部署至 Azure

在部署期間,您會建立在其中執行函數的應用程式服務執行個體。 當您將 .NET 主控台應用程式發佈至 Azure 中的 App Service 時,系統會自動以 WebJob 的形式執行。 若要深入了解發佈,請參閱使用 Visual Studio 開發及部署 WebJobs

建立 Azure 資源

  1. 在 [方案總管] 中,以滑鼠右鍵按一下專案並選取 [發行]

  2. 在 [發佈] 對話方塊中,針對 [目標] 選取 [Azure],然後再選取 [下一步]

  3. 選取 [特定目標] 的 [Azure WebJobs],然後再選取 [下一步]

  4. 上述 [App Service 執行個體]會選取加號 (+) 按鈕,以 [建立新的 Azure WebJob]

  5. 在 [建立 App Service (Windows)] 對話方塊中,使用如下表中指定的主機設定。

    設定 建議的值 名描述
    名稱 全域唯一的名稱 用以唯一識別新函式應用程式的名稱。
    訂用帳戶 選擇您的訂用帳戶 要使用的 Azure 訂用帳戶。
    資源群組 myResourceGroup 要在其中建立函數應用程式的資源群組名稱。 選擇 [新增] 以建立新的資源群組。
    主控方案 App Service 方案 App Service 方案會指定用來裝載應用程式的 Web 伺服器陣列位置、大小和功能。 在裝載多個應用程式時,您可以將 Web 應用程式設定為共用單一 App Service 方案來節省開支。 App Service 方案會定義區域、執行個體大小、縮放計數,以及 SKU (免費、共用、基本、標準或進階)。 選擇 [新增] 以建立新的 App Service 方案。 免費和基本階層不支援可讓您網站持續執行的 Always On 選項。

    Create App Service dialog box

  6. 選取 [建立],以在 Azure 中使用這些設定建立 WebJob 和相關資源,並且部署專案程式碼。

  7. 選取 [完成] 以返回 [發佈] 頁面。

啟用 Always On

若是連續的 WebJob,您應該在網站中啟用 Always on 設定,讓 WebJobs 正確執行。 如果您未啟用 Always on,執行階段會在閒置幾分鐘後閒置。

  1. 在 [發佈] 頁面中,選取 [裝載] 上方的三個點以顯示 [裝載設定檔區段動作],然後選擇 [在 Azure 入口網站中開啟]

  2. 在 [設定] 下,選擇 [設定]> [一般設定],將 [Always On] 設定為 [開啟],然後選取 [儲存] 和 [繼續] 以重新開啟網站。

發佈專案

在 Azure 中建立 Web 應用程式之後,就可以發佈 WebJobs 專案。

  1. 在 [裝載] 下的 [發佈] 頁面中,選取 [編輯] 按鈕,並將 [WebJob 類型] 變更為 Continuous,然後選取 [儲存]。 這可確保當訊息新增至佇列時,WebJob 正在執行。 觸發的 WebJobs 通常僅用於手動 Webhook。

    Change WebJob type from the VS 2022 Publish window.

  2. 選取 [發佈] 頁面右上角的 [發佈] 按鈕。 當作業完成時,WebJob 正在 Azure 上執行。

建立儲存體連線應用程式設定

您必須在 Azure 中建立您在 appsettings.json 設定檔本地使用的相同儲存體連接字串設定。 這可讓您更安全地儲存連接字串和

  1. 在 [發行] 設定檔頁面中,選取 [裝載] 上方的三個點以顯示 [裝載設定檔區段動作],然後選擇 [管理 Azure App Service 設定]

  2. 在 [應用程式設定] 中,選擇 [+ 新增設定]

  3. 在 [新增應用程式設定名稱] 中輸入 AzureWebJobsStorage,然後選取 [確定]

  4. 在 [遠端] 中,從本地設定貼上連接字串,然後選取 [確定]

連接字串現在已在 Azure 的應用程式中設定。

在 Azure 中觸發函式

  1. 請確定您並未在本地執行。 如果主控台視窗仍開啟,請將其關閉。 否則,本地執行個體可能是第一個處理您建立之任何佇列訊息的執行個體。

  2. 在 Visual Studio 的 [佇列] 頁面上,如同以前一般將訊息新增至佇列。

  3. 重新整理 [佇列] 頁面,新訊息會消失,因為它已由 Azure 中執行的函式進行處理。

啟用 Application Insights 記錄

當 WebJob 在 Azure 中執行時,您無法藉由檢視主控台輸出來監視函數執行。 若要能夠監視 WebJob,您應該在發佈專案時建立相關聯的 Application Insights 執行個體。

建立 Application Insights 執行個體

  1. 在 [發行] 設定檔頁面中,選取 [裝載] 上方的三個點以顯示 [裝載設定檔區段動作],然後選擇 [在 Azure 入口網站中開啟]

  2. 在 [設定] 底下的 Web 應用程式中,選擇 [Application Insights],然後選取 [開啟 Application Insights]

  3. 確認執行個體和 [位置] 產生的 [資源名稱],然後選取 [套用]

  4. 在 [設定] 下,選擇 [設定],並確認已建立新的 APPINSIGHTS_INSTRUMENTATIONKEY。 此金鑰會用來將 WebJob 執行個體連線到 Application Insights。

若要利用 Application Insights 記錄,您還需要更新記錄程式碼。

安裝 Application Insights 延伸模組

  1. 取得 Microsoft.Azure.WebJobs.Logging.ApplicationInsights NuGet 套件 3.x 版的最新穩定版本。

  2. 在下列命令中,以您在步驟 1 中找到的目前版本號碼取代 <3_X_VERSION>。 每個類型的 NuGet Package 都有唯一的版本號碼。

    Install-Package Microsoft.Azure.WebJobs.Logging.ApplicationInsights -Version <3_X_VERSION>
    
  3. 套件管理員主控台中,在 PM> 進入點執行具有目前版本號碼的命令。

初始化 Application Insights 記錄提供者

開啟 Program.cs,並在呼叫 AddConsole 之後,於 ConfigureLogging 中新增下列初始設定式:

// 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.AddAzureStorage();
            });
    builder.ConfigureLogging((context, b) =>
            {
                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。

重新發佈專案,並再次觸發函數

  1. 在 [方案總管] 中,以滑鼠右鍵按一下專案並選取 [發行]

  2. 像之前一樣,使用 Azure 入口網站建立佇列訊息,做法如稍早一樣,但請輸入 Hello App Insights! 做為訊息文字。

  3. 在 [發行] 設定檔頁面中,選取 [裝載] 上方的三個點以顯示 [裝載設定檔區段動作],然後選擇 [在 Azure 入口網站中開啟]

  4. 在 [設定] 底下的 Web 應用程式中,選擇 [Application Insights],然後選取 [檢視 Application Insights 資料]

  5. 選取 [搜尋],然後選取 [查看過去 24 小時內的所有資料]

    Select Search

  6. 如果您沒有看到 [Hello App Insights!] 訊息,請選取每隔幾分鐘定期重新整理。 因為 Application Insights 用戶端需要一些時間排清其所處理的記錄,所以記錄不會立即出現。

    Logs in Application Insights

新增輸入/輸出繫結

繫結可簡化讀取和寫入資料的程式碼。 輸入繫結可簡化可讀取資料的程式碼。 輸出繫結可簡化可寫入資料的程式碼。

新增繫結

輸入繫結可簡化可讀取資料的程式碼。 在此範例中,佇列訊息會是 blob 名稱,而您將使用 blob 名稱在 Azure 儲存體中尋找和讀取 blob。 然後,您將使用輸出繫結,將檔案的複本寫入相同的容器。

  1. Functions.cs 中,新增 using

    using System.IO;
    
  2. 以下列程式碼取代 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-

  3. Program.csConfigureWebJobs 擴充方法中,在 HostBuilder 執行個體上新增 AddAzureStorageBlobs 方法 (在 Build 命令之前),以初始化儲存體延伸模組。 此時,ConfigureWebJobs 方法如下列所示:

    builder.ConfigureWebJobs(b =>
    {
        b.AddAzureStorageCoreServices();
        b.AddAzureStorageQueues();
        b.AddAzureStorageBlobs();
    });
    
  4. 在儲存體帳戶中建立 Blob 容器。

    a. 在 Azure 入口網站中,瀏覽至 [資料儲存體] 下的 [容器] 索引標籤,並選取 [+ 容器]

    b. 在 [新增容器] 對話方塊中,輸入 container 做為容器名稱,然後選取 [建立]

  5. 將 Program.cs 檔案上傳至 Blob 容器。 (這個檔案在此作為範例;您可以上傳任何文字檔案,並使用檔案的名稱建立佇列訊息。)

    a. 選取您建立的新容器

    b. 選取上傳按鈕。

    Blob upload button

    c. 尋找並選取 Program.cs,然後選取 [確定]

重新發佈專案

  1. 在 [方案總管] 中,以滑鼠右鍵按一下專案並選取 [發行]

  2. 在 [發佈] 對話方塊中,確認已選取目前的設定檔,然後選取 [發佈]。 [輸出] 視窗中會詳細說明發佈的結果。

  3. 以 Program.cs 作為訊息文字,在您稍早建立的佇列中建立佇列訊息。

    Queue message Program.cs

  4. 檔案複本 copy-Program.cs 將出現在 Blob 容器中。

下一步

本教學課程說明如何建立、執行及部署 WebJobs SDK 3.x 專案。