共用方式為


使用 Visual Studio 來開發 Azure Functions

Visual Studio 提供開發、測試 C# 類別程式庫函式並將其部署至 Azure 的方法。 如果此體驗是您第一次使用 Azure Functions,請參閱 Azure Functions 概觀

若要快速入門,先考慮完成適用於 Visual Studio 的 Functions 快速入門

本文提供如何使用 Visual Studio 開發 C# 類別程式庫函式並將其發佈至 Azure 的詳細資訊。 開發 C# 類別庫函式有兩種模型:隔離工作者模型進程內部模型

您正在閱讀本文的隔離工作模式版本。 您可以在文章頂部選擇您喜歡的型號。

您正在閱讀本文的進行中模型版本。 您可以在文章頂部選擇您喜歡的型號。

除非另有註明,否則顯示的程式和範例適用於 Visual Studio 2022。 如需 Visual Studio 2022 版本的詳細資訊,請參閱 版本資訊預覽版本資訊

先決條件

  • Visual Studio 2022,包括 Azure 開發工作負載。

  • 發佈程序期間,系統會在您的訂用帳戶中建立您需要的其他資源,例如 Azure 儲存體帳戶。

  • 如果您沒有 Azure 帳戶,請在開始之前建立 免費帳戶

建立 Azure Functions 專案

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

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

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

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

  4. [其他資訊] 對話方塊中,執行下表中列出的動作:

    設定 動作 說明
    函式背景工作 選取 .NET 8.0 Isolated (長期支援) Visual Studio 會建立在 隔離工作程序中執行的函式專案。 隔離式背景工作處理序也支援不提供長期支援 (LTS) 的其他版本的 .NET 和 .NET Framework。 如需詳細資訊,請參閱 Azure Functions 執行階段版本概觀
    Function 選取 Http trigger Visual Studio 會建立由 HTTP 要求觸發的函式。
    使用 Azurite 作為執行階段儲存帳戶 (AzureWebJobsStorage) 選取此核取方塊。 因為 Azure 中的函數應用程式需要儲存體帳戶,所以當您將專案發佈至 Azure 時,就會指派或建立一個儲存體帳戶。 HTTP 觸發程序不會使用儲存體帳戶連接字串。 所有其他觸發器類型都需要有效的儲存帳戶連接字串。
    授權層級 選取 [匿名]。 當您使用此授權設定時,任何用戶端都可以觸發建立的函數,而無需提供金鑰。 此設定可讓您輕鬆測試新功能。 如需詳細資訊,請參閱授權層級

    Visual Studio 其他資訊對話方塊的螢幕擷取畫面,其中顯示已設定的選項,例如 Functions 背景工作角色的隔離式 .NET 版本。

    設定 動作 說明
    函式背景工作 選取 [.NET 8.0 內含式 (長期支援)] Visual Studio 會建立函式專案,此專案在進程中以 4.x 版的 Functions 執行階段執行。 如需詳細資訊,請參閱 Azure Functions 執行階段版本概觀
    Function 選取 Http trigger Visual Studio 會建立由 HTTP 要求觸發的函式。
    使用 Azurite 作為執行階段儲存帳戶 (AzureWebJobsStorage) 選取此核取方塊。 因為 Azure 中的函數應用程式需要儲存體帳戶,所以當您將專案發佈至 Azure 時,就會指派或建立一個儲存體帳戶。 HTTP 觸發程序不會使用儲存體帳戶連接字串。 所有其他觸發器類型都需要有效的儲存帳戶連接字串。
    授權層級 選取 [ 匿名] 當您使用此授權設定時,任何用戶端都可以觸發建立的函數,而無需提供金鑰。 此設定可讓您輕鬆測試新功能。 如需詳細資訊,請參閱授權層級

    Visual Studio 其他資訊對話方塊的螢幕擷取畫面,其中顯示已設定的選項,例如 Functions 背景工作角色的內含式 .NET 版本。

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

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

建立 Functions 專案之後,專案範本會建立 C# 專案、安裝 Microsoft.Azure.Functions.WorkerMicrosoft.Azure.Functions.Worker.Sdk NuGet 套件,並設定目標架構。

建立 Functions 專案之後,專案範本會建立 C# 專案、安裝 Microsoft.NET.Sdk.Functions NuGet 套件,並設定目標架構。

新專案含有下列檔案:

  • host.json:此檔案可讓您設定 Functions 主機。 這些設定同時適用於在本機執行及在 Azure 中執行。 如需詳細資訊,請參閱 host.json 參考

  • local.settings.json:此檔案會維護您在本機執行函式時使用的設定。 當您的應用程式在 Azure 中執行時,不會使用這些設定。 如需詳細資訊,請參閱 在本機使用應用程式設定

    重要事項

    因為 local.settings.json 檔案可以包含秘密,所以您必須將其從專案原始檔控制中排除。 在此檔案的 [屬性] 對話方塊中,請確定 [複製到輸出目錄] 設定設定為 [複製 (如果較新)。

如需詳細資訊,請參閱隔離工作者指南中的 專案結構

如需詳細資訊,請參閱 Functions 類別庫專案

在本機使用應用程式設定

當您的函式應用程式在 Azure 中執行時,函式所需的設定會以 加密方式儲存在應用程式設定中。 在當地開發期間,這些設定會被新增至 Values 集合,位於 local.settings.json 檔案中。 local.settings.json 檔案也會儲存本機開發工具所使用的設定。

Values專案local.settings.json檔案中的集合項目旨在反映 Azure 中函式應用程式應用程式設定中的項目。

當您發佈專案時,Visual Studio 不會在 local.settings.json 中自動上傳設定。 若要確定這些設定也存在於 Azure 中的函式應用程式,請在發佈專案之後上傳這些設定。 如需詳細資訊,請參閱函式應用程式設定。 集合中的 ConnectionStrings 值不會發佈。

您的程式碼也可以將這些函數應用程式設定值讀取為環境變數。 如需詳細資訊,請參閱環境變數

設定專案以進行本機開發

Functions 執行階段會在內部使用儲存體帳戶。 在開發期間,您可以針對此內部帳戶使用有效的儲存體帳戶,也可以使用 Azurite 模擬器

對於 HTTP 和 Webhook 以外的所有觸發器類型,您需要在 Values.AzureWebJobsStorage 檔案中設定索引鍵的值:

  • 針對儲存體帳戶,請將值設定為儲存體帳戶的連接字串。
  • 對於模擬器,將值設定為 UseDevelopmentStorage=true

如果您使用模擬器,請在部署之前將此設定變更為實際的儲存體帳戶連接字串。 如需詳細資訊,請參閱本機儲存體模擬器

若要設定儲存體帳戶連接字串,請採取下列步驟:

  1. 登入Azure 入口網站,然後前往您的儲存帳戶。

  2. 選取 [安全性 + 網路>存取金鑰]。key1 底下,複製 [連接字串] 值。

  3. 在您的 Visual Studio 專案中,開啟 local.settings.json 檔案。 將 AzureWebJobsStorage 索引鍵的值設定為您已複製的連接字串。

  4. 重複上一步,針對函數所需的其他任何連接,將唯一機碼新增至 Values 陣列。

將函式新增至您的專案

在 C# 類別庫函式中,函式使用的繫結是透過在程式碼中套用屬性來定義的。 當您從提供的範本建立函數觸發程序時,系統會為您套用這些觸發程序屬性。

  1. 在 [方案總管] 中,於專案節點按一下滑鼠右鍵,然後選取 [新增]> [新增 Azure Function]

  2. 在 [新增專案] 對話方塊中,選取 [Azure 函式],然後選取 [新增]。

  3. 選擇觸發器,然後設定必要的繫結屬性。 如果您選取儲存體服務觸發程序,且想要設定連線,請選取設定觸發程序連線的核取方塊。 下列範例顯示建立佇列儲存觸發程式函數的設定。

    佇列觸發程序的 [新增 Azure Function] 對話方塊的螢幕擷取畫面,其中連接字串名稱設定為 QueueStorage,並將佇列設定為 myqueue-items。

  4. 選取 ,然後新增。 如果您在上一個步驟中選取設定儲存連線的核取方塊,則會出現「 連線至相依性 」頁面。 選取 Azurite 儲存體模擬器或 Azure 儲存體,然後選取 [ 下一步]。

    • 如果您選取 Azurite 儲存模擬器、則會出現「 連線至儲存 Azurite 模擬器 」頁面。 請採取下列步驟:
      1. 選取 下一步
      2. [ 變更摘要 ] 頁面上,選取 [ 完成]。 Visual Studio 會設定相依性,並建立觸發程式類別。
    • 如果您選取 [Azure 儲存體],則會出現 [ 連線至 Azure 儲存體 ] 頁面。 請採取下列步驟:
      1. 選取儲存體帳戶,然後選取 [ 下一步]。 Visual Studio 會嘗試連線到您的 Azure 帳戶並擷取端點。
      2. 選取 下一步
      3. [ 變更摘要 ] 頁面上,選取 [ 完成]。 Visual Studio 會設定相依性,並建立觸發程式類別。

    此觸發程序範例會針對儲存體連線,透過名為 QueueStorage 的金鑰使用應用程式設定。 此金鑰 (儲存在 local.settings.json 檔案中) 會參考 Azurite 模擬器或儲存體帳戶。

  5. 檢查新加入的類別。 例如,下列 C# 類別代表基本的佇列儲存體觸發程式函式:

    Run() 方法被標註了 Function。 這個屬性指出該方法是函數的進入點。

    using System;
    using Azure.Storage.Queues.Models;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Extensions.Logging;
    
    namespace Company.Function;
    
    public class QueueTriggerCSharp
    {
        private readonly ILogger<QueueTriggerCSharp> _logger;
    
        public QueueTriggerCSharp(ILogger<QueueTriggerCSharp> logger)
        {
            _logger = logger;
        }
    
        [Function(nameof(QueueTriggerCSharp))]
        public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")] QueueMessage message)
        {
            _logger.LogInformation("C# Queue trigger function processed: {messageText}", message.MessageText);
        }
    }
    

    靜態 Run() 方法具有 FunctionName 屬性。 這個屬性指出該方法是函數的進入點。

    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    
    namespace Company.Function
    {
        public class QueueTriggerCSharp
        {
            [FunctionName("QueueTriggerCSharp")]
            public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")]string myQueueItem, ILogger log)
            {
                log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            }
        }
    }
    

會將繫結特定屬性套用至提供給進入點方法的每個繫結參數。 屬性會將繫結資訊作為參數使用。

在上述程式碼中,第一個參數套用了 QueueTrigger 屬性,該屬性表示佇列儲存體觸發程序函數。 佇列名稱和連接字串設定名稱會作為參數傳遞至 QueueTrigger 屬性。 在課堂上:

  • 佇列名稱參數應符合您在先前步驟中用來建立觸發程式的佇列名稱,例如 myqueue-items
  • 連接字串設定名稱應該符合您在先前步驟中用來建立觸發程式的名稱,例如 QueueStorage

如需詳細資訊,請參閱 Azure Functions 的 Azure 佇列儲存體觸發器

使用上述程序將更多函式新增至函式應用程式專案。 專案中的每個函式都可以有不同的觸發程序,但函式必須只有一個觸發程序。 如需詳細資訊,請參閱 Azure Functions 觸發程式和繫結

新增繫結

和觸發程序一樣,輸入和輸出繫結會新增至函式作為繫結屬性。 若要將繫結新增至函式,請執行下列步驟:

  1. 確定您設定的是用於本機開發的專案

  2. 為每個特定繫結新增適當的 NuGet 延伸模組套件。 如需繫結特定的 NuGet 套件需求,請參閱該繫結的參考文章。 例如,如需 Azure 事件中樞觸發程序的套件需求,請參閱 Azure Functions 的 Azure 事件中樞觸發程序和系結

  3. 在套件管理員主控台中使用下列命令來安裝特定套件:

    Install-Package Microsoft.Azure.Functions.Worker.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
    
    Install-Package Microsoft.Azure.WebJobs.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
    

    在此程式碼中,取代 <BINDING_TYPE> 為繫結延伸的特定名稱,並取代 <TARGET_VERSION> 為套件的特定版本,例如 4.0.0。 有效的版本會列在 NuGet.org 的個別套件頁面上。

  4. 如果有繫結所需的應用程式設定,請將其新增至Values中的 集合。

    函式在本機執行時會使用這些值。 當函式在 Azure 中的函式應用程式中執行時,其會使用函式應用程式設定。 Visual Studio 可讓您輕鬆地將本機設定發佈至 Azure

  5. 在方法簽章中新增適當的繫結屬性。 在下列程式碼中,佇列訊息會觸發函 Run 式。 然後,輸出繫結會在不同的佇列中建立具有相同文字的新佇列訊息。

     public class QueueTrigger
    {
        private readonly ILogger _logger;
    
        public QueueTrigger(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<QueueTrigger>();
        }
    
        [Function("CopyQueueMessage")]
        [QueueOutput("myqueue-items-destination", Connection = "QueueStorage")]
        public string Run([QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem)
        {
            _logger.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            return myQueueItem;
        }
    }
    

    QueueOutput 屬性會定義方法上的繫結。 針對多個輸出繫結,您可以改為將此屬性放在傳回物件的字串屬性上。 如需詳細資訊,請參閱多重輸出繫結

    public static class SimpleExampleWithOutput
    {
        [FunctionName("CopyQueueMessage")]
        public static void Run(
            [QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem, 
            [Queue("myqueue-items-destination", Connection = "QueueStorage")] out string myQueueItemCopy,
            ILogger log)
        {
            log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}");
            myQueueItemCopy = myQueueItem;
        }
    }
    

    Queue 參數上的 out 屬性會定義輸出繫結。

    與佇列儲存體的連線是從 QueueStorage 設定中取得。 如需詳細資訊,請參閱特定繫結的參考文章。

針對 Functions 支援的繫結如需完整清單,請參閱支援的繫結。 如需此案例的更完整範例,請參閱 使用Visual Studio將函式連線至 Azure 記憶體

在本機執行函式

您可以使用 Azure Functions 核心工具,在本機開發電腦上執行 Functions 專案。 當您選取 F5 來偵錯 Functions 專案時,本機 Functions 主機 (func.exe) 會開始接聽本機埠 (通常是 7071) 。 任何可呼叫的函式端點都會寫入輸出,而且您可以使用這些端點來測試函式。 如需詳細資訊,請參閱 使用 Core Tools 在本機開發 Azure Functions。 第一次從 Visual Studio 啟動函式時,系統會提示您安裝這些工具。

重要事項

從 Core Tools 4.0.6517 版開始,內含式模型專案必須參考 Microsoft.NET.Sdk.Functions 4.5.0 版或更新版本。 如果您使用舊版, func start 指令會產生錯誤。

若要在 Visual Studio 中以偵錯模式啟動函式,請採取下列步驟:

  1. 選取 F5。 如果出現提示,請接受 Visual Studio 的要求,以下載並安裝 Azure Functions 核心工具。 您可能還需要開啟防火牆例外狀況,以便工具可以處理 HTTP 請求。

  2. 當專案執行時,請以測試已部署函式相同的方式測試程式碼。

    在您在偵錯模式下執行 Visual Studio 時,會依預期遇到中斷點。

如需使用 Visual Studio 的更詳細測試案例,請參閱本文稍後的 測試函式

發佈至 Azure

當您將 Functions 專案發佈至 Azure 時,Visual Studio 會使用 zip 部署 來部署專案檔案。 可能的話,您也應該選取 [從套件檔案執行] ,讓專案在部署 (.zip) 套件中執行。 如需詳細資訊,請參閱在 Azure 中從套件檔案執行函式

請勿使用 Web Deploy (msdeploy) 部署至 Functions。

使用下列步驟,將專案發佈至 Azure 中的函式應用程式:

  1. [方案總管] 中,以滑鼠右鍵按一下專案,然後選取 [發佈]。

  2. [發佈] 頁面上,進行下列選取:

    • [目標] 上,選取 [Azure],然後選取 [下一步]。
    • [特定目標] 上,選取 [Azure 函式應用程式],然後選取 [ 下一步]。
    • [函式實例] 上,選取 [ 新建]。

    「發佈」頁面的螢幕擷取畫面。在 [函式執行個體] 區段中,會顯示資源群組,並醒目提示 [建立新]。

  3. 使用下表中的指定值建立新的執行個體:

    設定 說明
    名稱 全域唯一的名稱 名稱必須唯一識別您的新函數應用。 接受建議的名稱或輸入新名稱。 下列字元有效: a-z0-9-
    訂用帳戶名稱 您的訂閱名稱 函式應用程式是在 Azure 訂用帳戶中建立。 接受預設訂閱,或從清單中選取不同的訂閱。
    資源群組 資源群組的名稱 函式應用程式是在資源群組中建立。 選取 [新建] 來建立新的資源群組。 您也可以從清單中選取現有的資源群組。
    方案類型 彈性消費 當您將專案發佈至 在 Flex 取用方案中執行的函式應用程式時,您只能支付函式應用程式的執行費用。 其他託管方案可能會導致較高的成本。
    重要:
    建立彈性取用方案時,您必須先選取 [App Service 方案 ],然後重新選取 [ 彈性取用 ] ,以清除對話方塊的問題。
    作業系統 Linux Flex Consumption 方案目前需要Linux。
    位置 應用程式服務的位置 選取 彈性取用方案所支援的 Azure 區域中的位置。 選取不支援的區域時, 「建立」 按鈕會呈現灰色。
    執行個體記憶體大小 2048 執行應用程式的 虛擬機器實例的記憶體大小 是 Flex Consumption 方案所獨有的。
    Azure 儲存體 一般用途儲存體帳戶 Functions 執行階段需要儲存體帳戶。 選取 [新增] 以設定一般用途的儲存體帳戶。 您也可以使用符合 儲存體帳戶需求的現有帳戶。
    應用程式深入解析 Application Insights 執行個體 您應為函數應用程式啟用 Application Insights 整合。 選取 [新增],以在新的或現有的 Log Analytics 工作區中建立新的執行個體。 您也可以使用現有的執行個體。

    函式應用程式新建對話方塊的螢幕截圖。已填入名稱、訂閱、資源群組、方案和其他設定的欄位。

  4. 選取 [建立],以在 Azure 中建立函數應用程式及其相關資源。 資源建立的狀態會顯示在視窗左下角。

  5. 選取 完成。 [發行設定檔建立進度] 視窗隨即顯示。 當建立個人設定時,選擇[關閉]

  6. 在發佈設定檔頁面上,選取 [發佈] ,將包含專案檔案的套件部署至 Azure 中的新函式應用程式。

    部署完成時,Azure 中函式應用程式的根 URL 會顯示在發佈設定檔頁面上。

  7. 在發佈設定檔頁面上,移至 [託管] 區段。 選取省略符號 (...),然後選取 [ 在 Azure 入口網站中開啟]。 新的函數應用程式 Azure 資源會在 Azure 入口網站中開啟。

    發佈設定檔頁面的螢幕擷取畫面。在 [主機] 區段中,省略號選單已開啟,並且 [在 Azure 入口網站中開啟] 被醒目提示。

函數應用程式設定

Visual Studio 不會在您發佈專案時自動上傳應用程式設定。 如果您將設定新增至 local.settings.json 檔案,也必須將它們新增至 Azure 中的函式應用程式。

將必要設定上傳至 Azure 中的函式應用程式的最簡單方式,就是在 Visual Studio 中管理它們。 在發佈設定檔頁面上,移至 [託管] 區段。 選取省略符號 (...),然後選取 [管理 Azure App Service 設定]。

發佈設定檔頁面 [裝載] 區段的螢幕擷取畫面。省略符號捷徑功能表已開啟,並醒目提示 [管理 Azure App Service 設定]。

當您進行選取時,會開啟函式應用程式的 [應用程式設定 ] 對話方塊。 您可以使用此對話方塊來新增應用程式設定或修改現有設定。

應用程式設定對話方塊的螢幕擷取畫面,其中顯示各種設定的本機和遠端值,以及用於新增和編輯值的控制項。

針對每個設定, 本機 值是 local.settings.json 檔案中的值,而 遠端 值是 Azure 函式應用程式中的值。

  • 若要建立應用程式設定,請選取 [ 新增設定]。
  • 若要將設定值從 「本機」 欄位複製到 「遠端 」欄位,請選取 「從本機插入值」。

當您選取 [確定] 時,暫止的變更會寫入至本機設定檔案和函式應用程式。

附註

根據預設,local.settings.json 檔案不會被簽入版本控制系統。 因此,如果您從原始碼管理系統中複製本機 Functions 專案,專案就沒有 local.settings.json 檔案。 您必須在專案根目錄中手動建立 local.settings.json 檔案,以便 應用程式設定 對話方塊如預期般運作。

您也可以使用下列其中一種方式管理應用程式設定:

遠端偵錯

若要從遠端偵錯函式應用程式,您必須發佈專案的偵錯組態。 您也必須在 Azure 的函式應用程式中開啟遠端偵錯。

本節假設您的函數應用程式的偵錯設定已發佈。

遠端偵錯考量

  • 不建議對生產環境服務使用遠端偵錯。
  • 若要使用遠端偵錯,您必須在進階版或 App Service 方案中裝載函式應用程式。
  • 目前只有在 Windows 上執行 C# 應用程式時才支援遠端偵錯。
  • 如果您在 Visual Studio 中開啟 [只我的程式碼] 功能,請將其關閉。 如需指示,請參閱 啟用或停用「只我的程式碼」。
  • 當您使用遠端偵錯時,請避免在岔斷點處長時間停止。 當進程停止超過幾分鐘時,Azure 會將其視為無回應的進程,並將其關閉。
  • 當您偵錯時,伺服器會將資料傳送至 Visual Studio,這可能會影響頻寬費用。 如需頻寬速率的相關信息,請參閱 定價計算機
  • 48 小時後,遠端偵錯會在您的函式應用程式中自動關閉。 之後,您需要重新開啟遠端偵錯。

附加偵錯工具

當您偵錯隔離的工作者進程應用程式時,您目前需要將遠端偵錯工具附加至個別的 .NET 進程。 還需要其他幾個配置步驟。

若要將遠端偵錯工具附加至在與函式主機不同的進程中執行的函式應用程式,請採取下列步驟:

  1. 在發佈設定檔頁面上,移至 [託管] 區段。 選取省略符號 (...),然後選取 [附加偵錯工具]。

    如果尚未啟用遠端偵錯,Visual Studio 會連線到您的函式應用程式並啟用遠端偵錯。

    附註

    因為遠端偵錯工具無法連線到主機進程,所以可能會出現錯誤訊息。 在任何情況下,本機偵錯工具都無法存取您的中斷點,也無法提供檢查變數或逐步執行程式碼的方法。

  2. 在 [Visual Studio 偵錯] 功能表上,選取 [附加至程序]。

  3. 在「 附加至程序 」對話方塊中,執行下列步驟:

    1. [連線類型] 旁,選取 [ Microsoft Azure App Services]。
    2. 連線目標旁邊,選取 尋找
  4. [Azure 連結至進程] 對話方塊中,搜尋並選取您的函式應用程式,然後選取 [ 確定]。

  5. 如果出現提示,請允許透過本機防火牆存取 Visual Studio。

  6. 返回 [ 附加至程序 ] 對話方塊,選取 [ 顯示所有使用者的程序]。 選取 [dotnet.exe],然後選取 [附加]。

    附加至程序對話方塊的螢幕擷取畫面。連線類型是 Microsoft Azure App Services。在製程表格中,已選取 dotnet.exe。

當作業完成時,系統會將您附加至在隔離式背景工作處理序中執行的 C# 類別庫程式碼。 此時,您可以正常地對函式應用程式進行偵錯。

若要將遠端偵錯工具附加至使用 Functions 主機執行同進程的函式應用程式,請採取下列步驟。

在發佈設定檔頁面上,移至 [託管] 區段。 選取省略符號 (...),然後選取 [附加偵錯工具]。

如果尚未啟用遠端偵錯,Visual Studio 會連線到您的函式應用程式並啟用遠端偵錯。 Visual Studios 也會找出並附加偵錯工具至應用程式的主機處理序。 此時,您可以正常地對函式應用程式進行偵錯。

當您完成偵錯時,您應該 關閉遠端偵錯

關閉遠端偵錯

完成遠端偵錯程式碼之後,您應該在 Azure 入口網站中關閉遠端偵錯。 遠端偵錯會在 48 小時後自動關閉,以防您忘記。

  1. 在發佈設定檔頁面上,移至 [託管] 區段。 選取省略符號 (...),然後選取 [ 在 Azure 入口網站中開啟]。 Azure 入口網站會開啟至您的專案已部署到其中的函數應用程式。

  2. 在函式應用程式中,選取 [設定>],然後移至 [一般設定] 索引標籤。在 [遠端偵錯] 旁邊,選取 [關閉]。 選取 [儲存],然後選取 [繼續]。

函式應用程式重新啟動之後,您就無法再從遠端連線到遠端處理序。 您可以在 Azure 入口網站中使用相同的索引標籤,在 Visual Studio 外部開啟遠端偵錯。

監控功能

監視您的函數的建議方法是將您的函數應用程式與 Application Insights 整合。 當您在 Visual Studio 發佈期間建立函式應用程式時,您應該開啟此整合。

如果在發佈期間因某種原因而未設定整合,您仍應該在 Azure 中開啟函式應用程式的 Application Insights 整合

如需使用 Application Insights 進行監視的詳細資訊,請參閱 監視 Azure Functions 中的執行

測試函數

本節說明如何建立 C# 同進程模型專案,您可以使用 xUnit (適用於 .NET 的開放原始碼單元測試工具) 來測試。

步驟 1:設定

請遵循下列步驟來設定環境,包括支援測試所需的應用程式專案和函式:

  1. 在 Visual Studio 中,建立名為 Functions 的 Azure Functions 專案。

  2. 從範本建立 HTTP 函式:

    1. [方案總管] 中,以滑鼠右鍵按一下 [Functions 專案],然後選取 [ 新增>Azure 函式]。
    2. 在 [新增專案] 對話方塊中,選取 [Azure 函式],然後選取 [新增]。
    3. 選取 HTTP 觸發,然後選取 新增
    4. 重新命名新類別 MyHttpTrigger
  3. 從範本建立計時器函數:

    1. [方案總管] 中,以滑鼠右鍵按一下 [Functions 專案],然後選取 [ 新增>Azure 函式]。
    2. 在 [新增專案] 對話方塊中,選取 [Azure 函式],然後選取 [新增]。
    3. 選取計時觸發器,然後選取新增
    4. 重新命名新類別 MyTimerTrigger
  4. 在解決方案中建立 xUnit 測試應用程式

    1. [方案總管] 中,以滑鼠右鍵按一下包含 Functions 專案的解決方案,然後選取 [新增>專案]。
    2. 選取 [xUnit 測試專案 ] 範本,然後選取 [ 下一步]。
    3. 將專案命名為 Functions.Tests
  5. Functions.Tests 專案中移除預設測試檔案。

  6. 使用 NuGet 將測試應用程式的參考新增至 Microsoft.AspNetCore.Mvc。 您可以使用套件管理員主控台,也可以採取下列步驟:

    1. [方案總管] 中,以滑鼠右鍵按一下 Functions.Tests 專案,然後選取 [管理 NuGet 套件]。
    2. 搜尋並安裝 Microsoft.AspNetCore.Mvc
  7. Functions.Tests 應用程式中,將 Functions 應用程式新增為參考

    1. [方案總管] 中,以滑鼠右鍵按一下 Functions.Tests 專案,然後選取 [ 新增>專案參考]。
    2. 選取 [函式] 專案,然後選取 [確定]。

步驟 2:建立測試類別

在本節中,您會建立用來執行自動化測試的類別。

每個函式都會採用 的 ILogger 實作來處理訊息記錄。 在某些測試中,不會記錄任何訊息,或者如何實作記錄並不重要。 其他測試需要評估記錄的訊息,以判斷測試是否應該通過。

  1. Functions.Tests 專案 NullScope 中建立名為的類別,並新增下列程式碼。 這個類別提供模擬範圍。 稍後的步驟中,您將建立 ILogger 的一個實作來運用此範圍。

    using System;
    
    namespace Functions.Tests
    {
        public class NullScope : IDisposable
        {
            public static NullScope Instance { get; } = new NullScope();
    
            private NullScope() { }
    
            public void Dispose() { }
        }
    }
    
  2. Functions.Tests 專案 ListLogger 中建立名為的類別,並新增下列程式碼。 這個類別會維護要在測試期間評估的訊息內部清單。 若要實作所需的 ILogger 介面,類別會使用類別中的 NullScope 模擬範圍。 測試案例會將模擬範圍傳遞至 ListLogger 類別。

    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Functions.Tests
    {
        public class ListLogger : ILogger
        {
            public IList<string> Logs;
    
            public IDisposable BeginScope<TState>(TState state) => NullScope.Instance;
    
            public bool IsEnabled(LogLevel logLevel) => false;
    
            public ListLogger()
            {
                this.Logs = new List<string>();
            }
    
            public void Log<TState>(LogLevel logLevel,
                                    EventId eventId,
                                    TState state,
                                    Exception exception,
                                    Func<TState, Exception, string> formatter)
            {
                string message = formatter(state, exception);
                this.Logs.Add(message);
            }
        }
    }
    

    ListLogger 類別實作了如 ILogger 介面所規定的下列成員:

    • BeginScope:範圍會將內容新增至您的記錄。 在此情況下,測試會指向類別上的 NullScope 靜態實例,以允許測試運作。
    • IsEnabled:提供的預設值 false 為 。
    • Log:此方法使用提供的 formatter 函數來格式化訊息。 然後,該方法將生成的文本添加到集合中 Logs

    Logs 集合是 List<string> 的執行個體,且在建構函式中初始化。

  3. 在名為 LoggerTypes.csFunctions.Tests 專案中建立程式碼檔,並新增下列程式碼:

    namespace Functions.Tests
    {
        public enum LoggerTypes
        {
            Null,
            List
        }
    }
    

    此列舉會指定測試所使用的記錄器類型。

  4. Functions.Tests 專案 TestFactory 中建立名為的類別,並新增下列程式碼:

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Http.Internal;
    using Microsoft.Extensions.Logging;
    using Microsoft.Extensions.Logging.Abstractions;
    using Microsoft.Extensions.Primitives;
    using System.Collections.Generic;
    
    namespace Functions.Tests
    {
        public class TestFactory
        {
            public static IEnumerable<object[]> Data()
            {
                return new List<object[]>
                {
                    new object[] { "name", "Bernardo" },
                    new object[] { "name", "Ananya" },
                    new object[] { "name", "Vlad" }
    
                };
            }
    
            private static Dictionary<string, StringValues> CreateDictionary(string key, string value)
            {
                var qs = new Dictionary<string, StringValues>
                {
                    { key, value }
                };
                return qs;
            }
    
            public static HttpRequest CreateHttpRequest(string queryStringKey, string queryStringValue)
            {
                var context = new DefaultHttpContext();
                var request = context.Request;
                request.Query = new QueryCollection(CreateDictionary(queryStringKey, queryStringValue));
                return request;
            }
    
            public static ILogger CreateLogger(LoggerTypes type = LoggerTypes.Null)
            {
                ILogger logger;
    
                if (type == LoggerTypes.List)
                {
                    logger = new ListLogger();
                }
                else
                {
                    logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
                }
    
                return logger;
            }
        }
    }
    

    TestFactory 類別實作下列成員:

    • Data:這個屬性會傳回範例數據的 IEnumerable 集合。 索引鍵值組代表傳入查詢字串的值。
    • CreateDictionary:這個方法接受一個鍵值對作為參數。 它會傳回一個新的 Dictionary 實例,並且用來建立一個 QueryCollection 實例,以表示查詢字串的值。
    • CreateHttpRequest:此方法建立一個 HTTP 請求,並使用指定的查詢字串參數進行初始化。
    • CreateLogger:這個方法會傳回用於測試的實作 ILogger 。 實作取決於 ILogger 指定的記錄器類型。 如果指定清單類型,則 ListLogger 實例會追蹤可以在測試中進行評估的已記錄訊息。
  5. Functions.Tests 專案 FunctionsTests 中建立名為的類別,並新增下列程式碼:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    using Xunit;
    
    namespace Functions.Tests
    {
        public class FunctionsTests
        {
            private readonly ILogger logger = TestFactory.CreateLogger();
    
            [Fact]
            public async void Http_trigger_should_return_known_string()
            {
                var request = TestFactory.CreateHttpRequest("name", "Bernardo");
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal("Hello, Bernardo. This HTTP triggered function executed successfully.", response.Value);
            }
    
            [Theory]
            [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
            public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue)
            {
                var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal($"Hello, {queryStringValue}. This HTTP triggered function executed successfully.", response.Value);
            }
    
            [Fact]
            public void Timer_should_log_message()
            {
                var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);
                new MyTimerTrigger().Run(null, logger);
                var msg = logger.Logs[0];
                Assert.Contains("C# Timer trigger function executed at", msg);
            }
        }
    }
    

    這個類別實作下列成員:

    • Http_trigger_should_return_known_string:此測試會使用查詢字串值 name=Bernardo 來建立對 HTTP 函式的要求。 此測試會檢查是否傳回預期的回應。
    • Http_trigger_should_return_string_from_member_data:此測試會使用 xUnit 屬性將範例數據提供給 HTTP 函式。
    • Timer_should_log_message:此測試會建立 的 ListLogger 實例,並將它傳遞給定時器函式。 函數執行之後,會檢查記錄檔,以確保預期的訊息存在。
  6. 若要存取測試中的應用程式設定,您可以將具有模擬環境變數值的實作插入IConfiguration函數中。

步驟 3:執行測試

若要在 Visual Studio 中執行測試,請選取 [檢視>測試總管]。[測試總管] 中,選取 [執行]>[檢視中所有測試]

Visual Studio 的螢幕擷取畫面。測試總管顯示已通過五個測試。在 [方案總管] 中,會顯示 Functions 和 Functions.Test 專案。

步驟 4:偵錯測試

若要偵錯測試,請於測試中設定中斷點。 在 [測試總管] 中,選取 [執行>偵錯上次執行]。