快速入门:创建 C# Durable Functions 应用

使用 Durable Functions(Azure Functions 的一项功能)在无服务器环境中编写有状态函数。 Durable Functions 管理应用程序中的状态、检查点和重启。

对于 .NET 类库函数,和 Azure Functions 类似,Durable Functions 支持两种进程模型。 若要详细了解这两种进程,请参阅进程内和独立工作进程 .NET Azure Functions 之间的差异

本快速入门介绍了如何使用 Visual Studio Code 在本地创建和测试“hello world”Durable Functions 应用。 此函数应用可协调对其他函数的调用并将其链接在一起。 接下来,在 Azure 中发布函数代码。 使用的工具可通过 Visual Studio Code Azure Functions 扩展获得。

显示 Visual Studio Code 中的 Durable Functions 应用代码的屏幕截图。

先决条件

若要完成本快速入门,你需要:

创建 Azure Functions 项目

在 Visual Studio Code 中,创建本地 Azure Functions 项目。

  1. 在“视图”菜单上选择“命令面板”(或选择 Ctrl+Shift+P)

  2. 在提示符 (>) 处输入命令,然后选择“Azure Functions: 创建新项目”

    显示创建 Functions 项目的命令的屏幕截图。

  3. 选择浏览。 在“选择文件夹”对话框中,转到要用于项目的文件夹,然后选择“选择”

  4. 在提示符处,选择或输入以下值:

    提示 操作 说明
    选择函数应用项目的语言 选择“C#” 创建本地 C# Functions 项目。
    选择版本 选择“Azure Functions v4” 只有在尚未安装 Core Tools 的情况下,才会出现此选项。 首次运行应用时,即已安装 Core Tools。
    选择 .NET 运行时 选择“.NET 8.0 独立” 创建一个支持在独立工作进程和 Azure Functions 运行时 4.0 中运行的 .NET 8 的 Functions 项目。 有关详细信息,请参阅如何指向 Azure Functions 运行时版本
    为项目的第一个函数选择模板 选择“Durable Functions 业务流程” 创建 Durable Functions 业务流程
    选择持久存储类型 选择“Azure 存储” Durable Functions 的默认存储提供程序 有关详细信息,请参阅 Durable Functions 存储提供程序
    提供函数名称 输入 HelloOrchestration 业务流程函数的名称。
    提供命名空间 输入 Company.Function 所生成类的命名空间。
    选择打开项目的方式 选择“在当前窗口中打开”。 在所选的文件夹中打开 Visual Studio Code。

如果需要创建项目,Visual Studio Code 会安装 Azure Functions Core Tools。 它还会在某个文件夹中创建一个函数应用项目。 此项目包含 host.jsonlocal.settings.json 配置文件。

另一个文件 (HelloOrchestration.cs) 包含 Durable Functions 应用的基本构建基块

方法 说明
HelloOrchestration 定义 Durable Functions 应用业务流程。 在此示例中,业务流程启动,创建一个列表,然后将三个函数调用的结果添加到列表中。 当三个函数调用完成后,它返回该列表。
SayHello 返回“hello”的简单函数应用。 此函数包含编排的业务逻辑。
HelloOrchestration_HttpStart HTTP 触发的函数,用于启动业务流程的实例并返回检查状态响应

有关这些函数的详细信息,请参阅 Durable Functions 类型和功能

配置存储

可以使用 Azurite(一个适用于 Azure 存储的模拟器)在本地测试该函数。 在 local.settings.json 中,将 AzureWebJobsStorage 的值设置为 UseDevelopmentStorage=true,如以下示例所示:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated"
  }
}

要在 Visual Studio Code 中安装并开始运行 Azurite 扩展,请在命令面板中输入“Azurite: Start”并选择 Enter

可以对 Durable Functions 应用使用其他存储选项。 有关存储选项及其优势的详细信息,请参阅 Durable Functions 存储提供程序

在本地测试函数

使用 Azure Functions Core Tools,可以在本地开发计算机上运行 Azure Functions 项目。 当你首次在 Visual Studio Code 中启动某个函数时,系统会提示你安装这些工具。

  1. 在 Visual Studio Code 中,在 SayHello 活动函数代码中设置断点,然后选择 F5 以启动函数应用项目。 “终端”面板会显示 Core Tools 的输出。

    注意

    有关调试的详细信息,请参阅 Durable Functions 诊断

    如果出现消息“找不到作业函数”,请将 Azure Functions Core Tools 安装更新到最新版本

  2. 在终端面板中,复制 HTTP 触发的函数的 URL 终结点。

    Azure 本地输出窗口的屏幕截图。

  3. 使用 HTTP 测试工具向 URL 终结点发送 HTTP POST 请求。

    响应是 HTTP 函数的初始结果。 它让你知道 Durable Functions 应用业务流程已成功启动。 它尚未显示业务流程的最终结果。 响应中包括了几个有用的 URL。

    此时,应当会命中活动函数中的断点,因为业务流程已启动。 逐步执行该操作以获取业务流程状态的响应。

  4. 复制 statusQueryGetUri 的 URL 值,将其粘贴到浏览器的地址栏中,然后执行请求。 或者也可以继续使用 HTTP 测试工具发出 GET 请求。

    请求将查询业务流程实例的状态。 应该会看到实例已完成,并且它包含 Durable Functions 应用的输出或结果,如以下示例所示:

    {
        "name":"HelloCities",
        "instanceId":"7f99f9474a6641438e5c7169b7ecb3f2",
        "runtimeStatus":"Completed",
        "input":null,
        "customStatus":null,
        "output":"Hello, Tokyo! Hello, London! Hello, Seattle!",
        "createdTime":"2023-01-31T18:48:49Z",
        "lastUpdatedTime":"2023-01-31T18:48:56Z"
    }
    

    提示

    了解如何通过断点观察 Durable Functions 应用的重播行为

  5. 若要停止调试,请在 Visual Studio Code 中选择 Shift+F5。

确认该函数可以在本地计算机上正确运行以后,即可将项目发布到 Azure。

登录 Azure

在发布应用之前,必须先登录到 Azure。

  1. 如果你尚未登录,请在活动栏中选择 Azure 图标。 然后,在“资源”区域中,选择“登录到 Azure...”。

    VS Code 中的“登录到 Azure”窗口的屏幕截图。

    如果你已登录并可以看到你的现有订阅,请转到下一部分。 如果还没有 Azure 帐户,请选择“创建 Azure 帐户...”。学生可以选择“创建面向学生的 Azure 帐户...”。

  2. 在浏览器中出现提示时,请选择你的 Azure 帐户,并使用你的 Azure 帐户凭据登录。 如果创建新帐户,你可以在创建帐户后登录。

  3. 成功登录后,可以关闭新浏览器窗口。 属于你的 Azure 帐户的订阅将显示在边栏中。

在 Azure 中创建函数应用

在本部分中,你将在 Azure 订阅中创建函数应用和相关的资源。

  1. 在活动栏中选择 Azure 图标。 然后在“资源”区域中,选择 + 图标,然后选择“在 Azure 中创建函数应用”选项。

    在 Azure 订阅中创建资源

  2. 根据提示提供以下信息:

    Prompt 选择
    选择订阅 选择要使用的订阅。 如果你在“资源”下只有一个订阅可见,则你不会看到此提示。
    输入函数应用的全局唯一名称 键入在 URL 路径中有效的名称。 将对你键入的名称进行验证,以确保其在 Azure Functions 中是唯一的。
    选择一个运行时堆栈 选择你一直在本地运行的语言版本。
    选择新资源的位置 为了获得更好的性能,请选择你附近的区域

    在 Azure 中创建各个资源时,该扩展会在“Azure: 活动日志”面板中显示这些资源的状态。

    Azure 资源创建日志

  3. 创建完成时,会在你的订阅中创建以下 Azure 资源。 资源基于你的函数应用名称进行命名:

    • 一个资源组:相关资源的逻辑容器。
    • 一个标准 Azure 存储帐户:用于维护项目的状态和其他信息。
    • 一个函数应用:提供用于执行函数代码的环境。 可以通过函数应用将函数分组为逻辑单元,以便在同一托管计划中更轻松地管理、部署和共享资源。
    • 一个应用服务计划:用于你的函数应用的基础主机。
    • 一个连接到函数应用的 Application Insights 实例,用于跟踪你的函数在应用中的使用情况。

    创建函数应用并应用了部署包之后,会显示一个通知。

    提示

    默认情况下,会根据你提供的函数应用名称创建函数应用所需的 Azure 资源。 默认情况下,还会在函数应用所在的新资源组中创建这些资源。 如果要自定义这些资源的名称或重复使用现有资源,则需要使用高级创建选项来发布项目

将项目部署到 Azure

重要

部署到现有函数应用将始终覆盖该应用在 Azure 中的内容。

  1. 在活动栏中选择 Azure 图标,然后在“工作区”区域中选择你的项目文件夹,并选择“部署...”按钮。

    从 Visual Studio Code 工作区部署项目

  2. 选择“部署到函数应用...”,然后选择刚刚创建的函数应用,选择“部署”。

  3. 在部署完成后,选择“查看输出”以查看创建和部署结果,其中包括你创建的 Azure 资源。 如果错过了通知,请选择右下角的响铃图标以再次查看。

    “查看输出”窗口的屏幕截图。

在 Azure 中测试函数

  1. 在 Visual Studio Code 输出面板中,复制 HTTP 触发器的 URL。 调用 HTTP 触发的函数的 URL 必须采用以下格式:

    https://<function-app-name>.chinacloudsites.cn/api/HelloOrchestration_HttpStart

  2. 将 HTTP 请求的这个新 URL 粘贴到浏览器的地址栏中。 使用已发布的应用时,必定获得与本地测试时相同的状态响应。

你使用 Visual Studio Code 创建和发布的 C# Durable Functions 应用已可供使用。

清理资源

如果你不再需要为完成本快速入门而创建的资源,为避免在 Azure 订阅中产生相关费用,请删除资源组和所有相关资源。

本快速入门介绍了如何使用 Visual Studio 2022 在本地创建和测试“hello world”Durable Functions 应用。 该函数可协调对其他函数的调用并将其链接在一起。 接下来,在 Azure 中发布函数代码。 使用的工具可通过 Visual Studio 2022 中的 Azure 开发工作负载获得

Visual Studio 2019 中的 Durable Functions 应用代码的屏幕截图。

先决条件

若要完成本快速入门,你需要:

  • Visual Studio 2022 已安装。

    确保还安装了 Azure 开发工作负荷。 Visual Studio 2019 也支持 Durable Functions 开发,但 UI 和步骤有所不同。

  • 已安装 Azure 模拟器且其正在运行。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

创建函数应用项目

Azure Functions 模板创建了一个项目,可将该项目发布到 Azure 中的函数应用。 可使用函数应用将函数分组为一个逻辑单元,以便更轻松地管理、部署、缩放和共享资源。

  1. 在 Visual Studio 的“文件”菜单中,依次选择“新建”>“项目” 。

  2. 在“创建新项目”中,搜索“functions”,选择“Azure Functions”模板,然后选择“下一步”

    Visual Studio 中“新建项目”对话框的屏幕截图。

  3. 对于“项目名称”,请输入项目的名称,然后选择“确定”。 项目名称必须可以充当 C# 命名空间,因此请勿使用下划线、连字符或非字母数字字符。

  4. 在“其他信息”下,使用下一个表中所述的设置

    Visual Studio 中“创建新的 Azure Functions 应用程序”对话框的屏幕截图。

    设置 操作 说明
    Functions 辅助角色 选择“.NET 8 独立(长期支持)”。 创建一个支持在独立工作进程和 Azure Functions 运行时 4.0 中运行的 .NET 8 的 Azure Functions 项目。 有关详细信息,请参阅如何指向 Azure Functions 运行时版本
    Function 输入“Durable Functions 业务流程”。 创建 Durable Functions 业务流程

    注意

    如果在“Functions 辅助角色”菜单中未显示“.NET 8 独立(长期支持)”,可能是因为没有最新的 Azure Functions 工具集和模板。 转到“工具”>“选项”>“项目和解决方案”>“Azure Functions”>“检查更新以下载最新版本”

  5. 要使用 Azurite 模拟器,请确保选中“将 Azurite 用于运行时存储帐户(AzureWebJobStorage)”复选框。 要使用 Durable Functions 业务流程模板创建 Functions 项目,请选择“创建”。 该项目具有运行函数所需的基本配置文件。

    注意

    可以为 Durable Functions 应用选择其他存储选项。 有关详细信息,请参阅 Durable Functions 存储提供程序

在应用文件夹中,名为 Function1.cs 的文件包含三个函数。 这三个函数是 Durable Functions 应用的基本构建基块:

方法 说明
RunOrchestrator 定义 Durable Functions 应用业务流程。 在此示例中,业务流程启动,创建一个列表,然后将三个函数调用的结果添加到列表中。 当三个函数调用完成后,它返回该列表。
SayHello 返回“hello”的简单函数应用。 此函数包含编排的业务逻辑。
HttpStart HTTP 触发的函数,用于启动业务流程的实例并返回检查状态响应

有关这些函数的详细信息,请参阅 Durable Functions 类型和功能

在本地测试函数

使用 Azure Functions Core Tools,可以在本地开发计算机上运行 Azure Functions 项目。 当你首次在 Visual Studio Code 中启动某个函数时,系统会提示你安装这些工具。

  1. 在 Visual Studio Code 中,在 SayHello 活动函数代码中设置断点,然后选择 F5。 如果系统提示,请接受 Visual Studio 的请求,下载并安装 Azure Functions Core(命令行)工具。 你还需要启用防火墙例外,这样工具才能处理 HTTP 请求。

    注意

    有关调试的详细信息,请参阅 Durable Functions 诊断

  2. 从 Azure Functions 运行时输出复制函数的 URL。

    Azure 本地运行时的屏幕截图。

  3. 将 HTTP 请求的 URL 粘贴到浏览器的地址栏中并执行请求。 以下屏幕截图显示该函数在浏览器中返回的对本地 GET 请求的响应:

    标注了 statusQueryGetUri 的浏览器窗口的屏幕截图。

    响应是 HTTP 函数的初始结果。 它让你知道持久业务流程已成功启动。 它尚未显示业务流程的最终结果。 响应中包括了几个有用的 URL。

    此时,应当会命中活动函数中的断点,因为业务流程已启动。 逐步执行该操作以获取业务流程状态的响应。

  4. 复制 statusQueryGetUri 的 URL 值,将其粘贴到浏览器的地址栏中,然后执行请求。

    请求将查询业务流程实例的状态。 应该会看到实例已完成,并且它包含持久函数的输出或结果,如以下示例所示:

    {
        "name":"HelloCities",
        "instanceId":"668814ac6ce84a43a9e6757f81dbc0bc",
        "runtimeStatus":"Completed",
        "input":null,
        "customStatus":null,
        "output":"Hello, Tokyo! Hello, London! Hello Seattle!",
        "createdTime":"2023-01-31T16:44:34Z",
        "lastUpdatedTime":"2023-01-31T16:44:37Z"
    }
    

    提示

    了解如何通过断点观察 Durable Functions 应用的重播行为

  5. 要停止调试,请选择 Shift + F5。

确认该函数可以在本地计算机上正确运行以后,即可将项目发布到 Azure。

将项目发布到 Azure

必须在 Azure 订阅中有函数应用才能发布项目。 可在 Visual Studio 中创建函数应用。

  1. 在“解决方案资源管理器” 中,右键单击该项目并选择“发布”。 在“目标”中,选择“Azure”,然后选择“下一步”。

    发布窗口的屏幕截图。

  2. 对于“特定目标”,请选择“Azure 函数应用(Windows)”(这将创建一个在 Windows 上运行的函数应用),然后选择“下一步”。

    具有特定目标的发布窗口的屏幕截图。

  3. 在“函数实例”中,选择“创建新的 Azure 函数…”。

    创建新的函数应用实例的屏幕截图。

  4. 使用下表中指定的值创建新的实例:

    设置 描述
    名称 全局唯一名称 用于唯一标识新 Function App 的名称。 接受此名称或输入新名称。 有效的字符是 a-z0-9-
    订阅 你的订阅 要使用的 Azure 订阅。 接受此订阅,或从下拉列表中选择一个新订阅。
    资源组 资源组的名称 你要在其中创建函数应用的资源组。 从下拉列表中选择一个现有资源组,或者选择“新建”来创建一个新的资源组。
    计划类型 消耗 将项目发布到在消耗计划中运行的函数应用时,只需为函数应用的执行付费。 其他托管计划会产生更高的成本。
    位置 应用服务的位置 在靠近你或者靠近函数访问的其他服务的区域中选择一个位置
    Azure 存储 常规用途存储帐户 Functions 运行时需要 Azure 存储帐户。 选择“新建”即可配置常规用途存储帐户。 也可选择一个符合存储帐户要求的现有帐户。

    “创建应用服务”对话框的屏幕截图。

  5. 选择“创建”,在 Azure 中创建一个函数应用及其相关资源。 资源创建的状态将显示在窗口左下角。

  6. 在“函数实例”中,确保已选中“从包文件运行”。 启用从包运行模式,函数应用将使用 Zip 部署进行部署。 建议为你的函数项目使用 Zip 部署方法,因为它可提高性能。

    完成配置文件创建的屏幕截图。

  7. 选择“完成”,然后在“发布”页面上选择“发布”,将包含项目文件的包部署到 Azure 中的新函数应用 。

    部署完成后,Azure 中函数应用的根 URL 将显示在“发布”选项卡中。

  8. 在“发布”选项卡中的“托管”部分中,选择“在 Microsoft Azure 门户中打开”。 此操作会在 Microsoft Azure 门户中打开新的函数应用 Azure 资源。

    发布成功消息的屏幕截图。

在 Azure 中测试函数

  1. 在“发布配置文件”页上,复制函数应用的基 URL。 将 URL 的 localhost:port 部分(在本地测试函数时使用)替换为新的基 URL。

    调用持久函数 HTTP 触发器的 URL 必须采用以下格式:

    https://<APP_NAME>.chinacloudsites.cn/api/<FUNCTION_NAME>_HttpStart

  2. 将 HTTP 请求的这个新 URL 粘贴到浏览器的地址栏中。 测试已发布的应用时,必定获得与本地测试时相同的状态响应。

你使用 Visual Studio 创建和发布的 C# Durable Functions 应用已可供使用。

清理资源

如果你不再需要为完成本快速入门而创建的资源,为避免在 Azure 订阅中产生相关费用,请删除资源组和所有相关资源。