在本機使用 Visual Studio 建立及測試簡單的 Azure 函式

已完成

使用者可以在 Azure 入口網站內撰寫、偵錯及部署 Azure 函式。 不過,直接在生產、預備、測試環境中撰寫函式可能不合適。 例如,撰寫適用於 Azure Functions 的自動化單元測試,或在 Azure 中使用將 Azure Functions 部署到函數應用程式的隨選部署。 通常來說,開發人員偏好使用程式碼編輯器和開發工具,而不是 Azure 入口網站所提供的環境。 Visual Studio 可讓您在單一專案中使用其他程式碼和服務,來開發和管理 Azure Functions 程式碼。

在線上豪華手錶的場景中,開發人員已經熟悉 Visual Studio 2022。 因此,您決定要使用 Visual Studio 作為主要開發環境,用來建立 Azure Functions。 此外,Visual Studio 還提供絶佳環境,可讓您先在本機測試函式,再將它們部署至 Azure。

在本單元中,您會了解如何使用 Visual Studio 中提供的工具,在本機電腦上建置和測試 Azure 函式。

重要

本文支援使用執行階段執行內含式的 .NET 類別庫函式。 您的 C# 函式也可以跨處理序執行,並與 Functions 執行階段隔離。 隔離式背景工作處理序模型是在目前版本的 Functions 執行階段中執行非 LTS 版本的 .NET 和 .NET Framework 應用程式的唯一方式。 若要深入了解,請參閱 .NET 隔離式背景工作處理序函式

修改 Visual Studio 安裝

首先,請使用您開發環境所需的 Web 與雲端工具來設定 Visual Studio。

  1. 在本機安裝 Visual Studio 2022 之後,開啟 Visual Studio 安裝程式,並在 [Visual Studio Community 2022] 上選取 [修改]

    Visual Studio 安裝程式的螢幕擷取畫面,其中已醒目提示 [修改]。

  2. [修改 - Visual Studio] 頁面隨即出現。

    [修改 Visual Studio Community 2022 工作負載] 索引標籤的螢幕擷取畫面,其中已醒目提示 ASP.NET 與 Web 開發和 Azure 開發。

  3. 在 [工作負載] 索引標籤上,選取 [ASP.NET 和 Web 開發] 和 [Azure 開發] 核取方塊,然後選取 [修改]

  4. 在驗證對話方塊中,選取 [是]。 [Visual Studio 安裝程式] 頁面隨即出現,並顯示套件的安裝進度。

適用於 Visual Studio 的 Azure Functions 工具延伸模組

Azure Functions 工具是 Visual Studio 延伸模組,可讓您在本機開發環境中建立、測試及部署 Azure Functions。 為了快速建立新的 Azure 函數應用程式,此延伸模組會為您提供範本,用於從 Visual Studio 建置函式,並直接部署至 Azure。

Visual Studio 2022 包含 Azure Functions and Web Jobs Tools 延伸模組。

Azure 函數應用程式

函數應用程式會裝載一或多個函式。 其會為您的函式程式碼提供環境和執行階段。

函式由事件觸發,而不是直接從應用程式呼叫。 您可以在 Azure Functions 應用程式中指定會觸發每個函式的事件類型。 可用的事件包括:

  • Blob 觸發程序。 在 Azure Blob 儲存體中上傳或修改檔案時,就會執行此類型的函式。
  • 事件中樞觸發程序。 當事件中樞收到訊息時,事件中樞觸發程序會執行此函式。
  • Azure Cosmos DB 觸發程序。 在 Azure Cosmos DB 資料庫中新增或修改文件時,就會執行此觸發程序。 您可以使用此觸發程序來整合 Azure Cosmos DB 與其他服務。 例如,如果代表客戶訂單的文件新增至資料庫時,您可以使用觸發程序將訂單複本傳送至佇列,以進行處理。
  • HTTP 觸發程序。 在 Web 應用程式中發生 HTTP 要求時,HTTP 觸發程序會執行函式。 您也可以使用此觸發程序來回應 Webhook。 Webhook 是網站所裝載的項目遭到修改時,將會發生的回呼。 例如,您可以建立一個函式,當存放庫中的項目變更時,Webhook 會從 GitHub 存放庫中觸發該函式。
  • 佇列觸發程序。 當新的項目新增至 Azure 儲存體佇列時,此觸發程序就會啟動函式。
  • 服務匯流排佇列觸發程序。 當新的項目新增至 Azure 服務匯流排佇列時,此觸發程序就會執行函式。
  • 服務匯流排主題觸發程序。 此觸發程序會執行函式,以回應抵達服務匯流排主題的新訊息。
  • 計時器觸發程序。 此事件會遵循您定義的排程,定期執行函式。

顯示 Azure 函式觸發程序的螢幕擷取畫面,其中已醒目提示 HTTP 觸發程序。

下表顯示可與 Functions 特定版本搭配使用的最高層級 .NET Core 或 .NET Framework。

Functions 執行階段版本 內含式 隔離式背景工作處理序
Functions 4.x .NET 6.0 .NET 6.0
.NET 7.0
.NET 8.0
.NET Framework 4.8
Functions 1.x .NET Framework 4.8 n/a

Azure 函數應用程式會在 Azure 儲存體中儲存管理資訊、程式碼和記錄。 若要保存此資料,您需要建立一個儲存體帳戶。 儲存體帳戶必須支援 Azure Blob、佇列、檔案和資料表儲存體;請針對此目的使用一般的 Azure 儲存體帳戶。 您可以使用先前所示的對話方塊,指定要用於函式的儲存體帳戶。

函式可以執行具有特殊權限的作業或敏感性作業。 無法公開 HTTP 要求所觸發的函式。 您可能需要限制對所選取使用者群組執行此函式的能力。 透過指定觸發函式所需的存取權限,即可保護函式。 HTTP 要求所觸發的函式支援三種層級的存取權限:

  • Anonymous。 不需要進行驗證,任何使用者都可以觸發函式。
  • 函式。 HTTP 要求必須提供可讓 Azure 函式執行階段授權要求的金鑰。 您可以單獨建立此金鑰,且可以使用 Azure 入口網站對其進行維護。
  • 管理員。類似於函式。 使用者必須以觸發函式的 HTTP 要求指定金鑰。 差別在於金鑰是「系統管理」金鑰。 此金鑰可用來存取函數應用程式中的任何函式。 和函式金鑰一樣,您可以單獨建立此金鑰。

如果您要建立由 HTTP 要求以外事件所觸發的函式,您必須提供連接字串及其他詳細資料,函數應用程式需要有這些資料才能存取觸發事件的資源。 例如,如果您要撰寫 Blob 儲存體事件所觸發的函式,您必須針對對應的 Blob 儲存體帳戶指定其連接字串。

Azure 函數的結構

Azure 函數會實作為靜態類別。 此類別提供靜態、非同步方法,該方法名為 Run,可作為類別的進入點。

傳遞給 Run 方法的參數提供了觸發程序的內容。 如果它是 HTTP 觸發程序,則該函式會收到 HttpRequest 物件。 此物件包含要求的標頭和本文。 您可以使用任何 HTTP 應用程式中的可用相同技術,以存取要求中的資料。 套用至此函式的屬性可指定授權需求 (在此案例中為 Anonymous),以及函式回應目標的 HTTP 作業 (GETPOST)。

Visual Studio 所產生的下列程式碼範例會檢查作為要求 URL 一部分提供的查詢字串,並尋找稱為 name 的參數。 此程式碼還會使用 StreamReader 將要求本文還原序列化,並嘗試從要求中讀取也稱為 name 的屬性值。 如果在查詢字串或要求本文中找到 name,則會在回應中傳回 name 值。 否則,該函式會產生一個包含以下訊息的錯誤回應:Please pass a name on the query string or in the request body

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }
}

此函式會傳回值,其中包含包裝在 IActionResult 物件中的輸出資料和結果。 該值會在要求的 HTTP 回應本文中傳回。

不同類型的觸發程序會收到不同輸入參數和傳回型別。 下一個範例顯示針對 Blob 觸發程序所產生的程式碼。 在此範例中,可以透過 Stream 物件傳回 Blob 的內容,且還提供了 Blob 的名稱。 該觸發程序不會傳回任何資料;它的目的是讀取和處理具名 Blob 中的資料。

public static class Function2
{
    [FunctionName("Function2")]
    public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
    }
}

在所有情況下,函式都會傳遞 ILogger 參數。 此函式可以使用這個參數來寫入記錄訊息,而函式應用程式會將該訊息寫入儲存體,以供日後分析。

函式還包含中繼資料,其能指定觸發程序的類型、安全性需求,以及任何其他特定資訊需求。 您可以使用 HTTPTriggerBlobTrigger 或其他觸發程序屬性來修改中繼資料,如範例所示。 函式之前的 FunctionName 屬性是函數應用程式所使用之函式的識別碼。 此名稱不一定要與函式名稱相同,但最好是讓它們保持同步,以避免產生混淆。

在本機測試 Azure 函數應用程式

您可以使用視覺化偵錯工具,在本機建置及測試 Azure 函數應用程式。 若要啟動偵錯工具,請按 F5,或是在 [偵錯] 功能表上選取 [開始偵錯]。 本機版本的函式執行階段隨即啟動。 您的函式可用於測試。 此範例顯示裝載 Function1 (這是由 HTTP 事件觸發的函式) 的執行階段。 URL 指出函式目前所連接的端點。

顯示 Azure 函式執行階段的螢幕擷取畫面:範例 1。

如果您開啟網頁瀏覽器並瀏覽此 URL,您會觸發此函式。 下圖顯示 HTTP GET 要求不包含本文時所產生的回應。 針對從函式傳回 BadRequestObjectResult 物件的程式碼,您可看到其所產生的訊息。

顯示 Azure 函式執行階段的螢幕擷取畫面。

如果您提供一個包含 name 參數的查詢字串,則該函式會讀取並處理該值。

顯示 Azure 函式執行階段的螢幕擷取畫面:範例 2。

執行程式碼時,您會看到追蹤訊息出現在 [函式執行階段] 視窗中。 如果您需要設定中斷點,並檢查函式中的控制流程,您可以在 Visual Studio 中使用標準偵錯功能。