使用 Visual Studio 开发 Azure Functions

用于 Visual Studio 2017 的 Azure Functions 工具是 Visual Studio 的一个扩展,可用于开发、测试 C# 函数并将其部署到 Azure。 如果这是你第一次体验 Azure Functions,可以在 Azure Functions 简介中了解详细信息。

Azure Functions 工具提供以下优势:

  • 在本地开发计算机上编辑、生成和运行函数。
  • 将 Azure Functions 项目直接发布到 Azure。
  • 使用 Web 作业属性在 C# 代码中直接声明函数绑定,而无需单独维护绑定定义的 function.json。
  • 开发和部署预先编译的 C# 函数。 与基于 C# 脚本的函数相比,预先编译的函数的冷启动性能更好。
  • 可以在 C# 中编写函数的代码,同时利用 Visual Studio 开发环境的所有优势。

本文详细介绍了如何使用 Azure Functions Tools for Visual Studio 2017 开发 C# 函数并将其发布到 Azure。 在阅读本文之前,应先完成 Visual Studio 的函数快速入门

Important

不要将本地开发和门户开发混合在同一函数应用中。 从本地项目发布到函数应用时,部署过程会覆盖在门户中开发的任何函数。

先决条件

Azure Functions 工具包含在 Visual Studio 2017 版本 15.5 或更高版本的 Azure 开发工作负荷中。 请确保你在安装 Visual Studio 2017 时随附了Azure 开发工作负荷:

使用 Azure 开发工作负荷安装 Visual Studio 2017

请确保 Visual Studio 为最新版本,并且使用的是最新版本的 Azure Functions 工具。

其他要求

若要创建和部署函数,还需要:

  • 一个有效的 Azure 订阅。 如果没有 Azure 订阅,可以使用试用帐户

  • 一个 Azure 存储帐户。 若要创建存储帐户,请参阅创建存储帐户

检查工具版本

  1. 在“工具”菜单中,选择“扩展和更新”。 展开“已安装” > “工具”,选择“Azure Functions 和 Web 作业工具”。

    验证 Functions 工具版本

  2. 请注意已安装的版本。 可以将此版本与发行说明中列出的最新版本进行比较。

  3. 如果你的版本较旧,可以在 Visual Studio 中更新工具,如以下部分中所示。

更新工具

  1. 在“扩展和更新”对话框中,展开“更新” > “Visual Studio Marketplace”,依次选择“Azure Functions 和 Web 作业工具”和“更新”。

    更新 Functions 工具版本

  2. 下载工具更新后,请关闭 Visual Studio 以触发使用 VSIX 安装程序的工具更新。

  3. 在安装程序中,选择“确定”以启动,然后单击“修改”以更新工具。

  4. 更新完成后,请选择“关闭”并重启 Visual Studio。

创建 Azure Functions 项目

Visual Studio 中的 Azure Functions 项目模板创建一个项目,该项目可发布到 Azure 中的函数应用。 可使用函数应用将函数分组为一个逻辑单元,以用于管理、部署和共享资源。

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

  2. 在“新建项目”对话框中,依次选择“已安装” > “Visual C#” > “云” > “Azure Functions”。 输入项目的名称,并选择“确定”。 函数应用名称必须可以充当 C# 命名空间,因此请勿使用下划线、连字符或任何其他的非字母数字字符。

    “新建项目”对话框,用于在 Visual Studio 中创建函数

  3. 使用图像后的表中指定的设置。

    Visual Studio 中的“新建函数”对话框

    设置 建议的值 Description
    版本 Azure Functions 2.x
    (.NET Core)
    此设置创建使用 Azure Functions 运行时版本 2.x(支持 .NET Core)的函数项目。 Azure Functions 1.x 支持 .NET Framework。 有关详细信息,请参阅面向 Azure Functions 运行时版本
    模板 HTTP 触发器 此设置创建由 HTTP 请求触发的函数。
    存储帐户 存储模拟器 HTTP 触发器不使用 Azure 存储帐户连接。 所有其他触发器类型需要有效的存储帐户连接字符串。
    访问权限 匿名 在未提供密钥的情况下,任何客户端都可以触发创建的函数。 通过此授权设置可以轻松测试新函数。 有关密钥和授权的详细信息,请参阅 HTTP 和 Webhook 绑定中的授权密钥

    Note

    确保将“访问权限”设置为 Anonymous。 如果选择默认级别为 Function,需要在请求中提供函数密钥才能访问函数终结点。

  4. 选择“确定”以创建函数项目和 HTTP 触发的函数。

此项目模板创建 C# 项目,安装 Microsoft.NET.Sdk.Functions NuGet 包,并设置目标框架。 Functions 1.x 面向 .NET Framework,而 Functions 2.x 则面向 .NET Standard。 新项目包含以下文件:

  • host.json:用于配置 Functions 主机。 在本地和 Azure 中运行时,都会应用这些设置。 有关详细信息,请参阅 host.json 参考

  • local.settings.json:维护本地运行函数时使用的设置。 Azure 不使用这些设置,它们由 Azure Functions 核心工具使用。 使用此文件为函数所需的变量指定应用设置。 针对项目中的函数绑定所需的每个连接,将新项添加到 Values 数组。 有关详细信息,请参阅“Azure Functions 核心工具”一文中的本地设置文件

    Important

    由于 local.settings.json 文件可能包含机密,因此必须将其从项目源代码管理中排除。 此文件的“复制到输出目录”设置应始终为“如果较新则复制”。

有关详细信息,请参阅 Functions 类库项目

为本地开发配置项目

Functions 运行时在内部使用 Azure 存储帐户。 对于除 HTTP 和 Webhook 以外的所有触发器类型,必须将 Values.AzureWebJobsStorage 键设置为有效的 Azure 存储帐户连接字符串。 函数应用还可以在项目所需的 AzureWebJobsStorage 连接设置中使用 Azure 存储模拟器。 若要使用模拟器,请将 AzureWebJobsStorage 的值设置为 UseDevelopmentStorage=true。 在部署之前,必须将此设置更改为实际的存储连接。

若要设置存储帐户连接字符串,请执行以下操作:

  1. 在 Visual Studio 中,打开“Cloud Explorer”,展开“存储帐户” > “你的存储帐户”,然后选择“属性面板”并复制“主连接字符串”值。

  2. 在项目内,打开 local.settings.json 项目文件,并将“AzureWebJobsStorage”键的值设置为复制的连接字符串。

  3. 重复上述步骤,将唯一键添加到函数所需的其他任何连接的 Values 数组。

将函数添加到项目

在预先编译的函数中,可以通过在代码中应用属性来定义函数使用的绑定。 使用 Azure Functions 工具通过提供的模板创建函数时,系统会自动应用这些属性。

  1. 在“解决方案资源管理器”中,右键单击项目节点,然后选择“添加” > “新建项”。 选择“Azure 函数”,键入类的名称,然后单击“添加”。

  2. 选择你的触发器,设置绑定属性,然后单击“创建”。 以下示例显示创建队列存储触发的函数时的设置。

    创建队列触发的函数

    此触发器示例使用具有名为 QueueStorage 的键的连接字符串。 必须在 local.settings.json 文件中定义此连接字符串设置。

  3. 检查新添加的类。 将会看到一个静态 Run 方法,它已使用 FunctionName 属性设置了属性。 该属性指示该方法是函数的入口点。

    例如,以下 C# 类表示一个基本的队列存储触发的函数:

    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    
    namespace FunctionApp1
    {
        public static class Function1
        {
            [FunctionName("QueueTriggerCSharp")]
            public static void Run([QueueTrigger("myqueue-items", Connection = "QueueStorage")]string myQueueItem, ILogger log)
            {
                log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            }
        }
    }
    

    已向提供给入口点方法的每个绑定参数提供了特定于绑定的属性。 该属性采用绑定信息作为参数。 在上例中,第一个参数具应用了 QueueTrigger 属性,表示触发了队列的函数。 队列名称和连接字符串设置名称作为参数传递到“QueueTrigger”属性。 有关详细信息,请参阅 Azure Functions 的 Azure 队列存储绑定

可以使用上述过程向函数应用项目添加更多的函数。 项目中的每个函数可以有不同的触发器,但每个函数的触发器必须刚好一个。 有关详细信息,请参阅 Azure Functions 触发器和绑定概念

添加绑定

使用触发器时,输入和输出绑定是作为绑定属性添加到函数的。 向函数添加绑定,如下所示:

  1. 确保已为本地开发配置项目

  2. 为特定绑定添加适当的 NuGet 扩展包。 有关详细信息,请参阅“触发器和绑定”一文中的使用 Visual Studio 进行本地 C# 开发。 特定于绑定的 NuGet 包要求位于绑定的参考文章中。 例如,可以在事件中心绑定参考文章中找到事件中心触发器的包要求。

  3. 如果有绑定需要的应用设置,请将其添加到本地设置文件中的 Values 集合。 当函数在本地运行时,会使用这些值。 当函数在 Azure 的函数应用中运行时,会使用函数应用设置

  4. 将适当的绑定属性添加到方法签名。 在以下示例中,一条队列消息触发了该函数,而输出绑定则创建了一条新的队列消息,在不同的队列中使用了相同的文本。

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

    到队列存储的连接从 AzureWebJobsStorage 设置获取。 有关详细信息,请参阅特定绑定的参考文章。

下表显示了 Azure Functions 运行时的两个主要版本支持的绑定。

类型 1.x 2.x1 触发器 输入 输出
Blob 存储
Cosmos DB
事件中心
HTTP 和 Webhook
Microsoft Graph
Excel 表
Microsoft Graph
OneDrive 文件
Microsoft Graph
Outlook 电子邮件
Microsoft Graph
事件
Microsoft Graph
身份验证令牌
移动应用
通知中心
队列存储
SendGrid
服务总线
表存储
计时器

1 在 2.x 中,除了 HTTP 和 Timer 以外,所有绑定都必须注册。 请参阅注册绑定扩展

测试函数

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

若要测试函数,请按 F5。 如果系统提示,请按 Visual Studio 的请求下载和安装 Azure Functions Core (CLI) 工具。 可能还需启用一个防火墙例外,以便这些工具能够处理 HTTP 请求。

在运行项目时,可以像测试已部署的函数一样测试代码。 有关详细信息,请参阅在 Azure Functions 中测试代码的策略。 在调试模式下运行时,断点将按预期命中 Visual Studio。

若要详细了解如何使用 Azure Functions 核心工具,请参阅在本地编写 Azure 函数代码并对其进行测试

发布到 Azure

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

  2. 依次选择“Azure Function App”、“新建”、“发布”。

    选取发布目标

    启用“从 Zip 运行”后,Azure 中的函数应用将进入只读模式,并且会直接从部署包运行。 有关详细信息,请参阅从包文件运行 Azure Functions

    Caution

    选择“选择现有”时,Azure 中现有函数应用中的所有文件都将被本地项目中的文件覆盖。 仅在将更新重新发布到现有函数应用时才使用此选项。

  3. 如果尚未将 Visual Studio 连接到 Azure 帐户,请选择“添加帐户...”。

  4. 在“创建应用服务”对话框中,使用在图片下方的表中指定的“托管”设置:

    “创建应用服务”对话框

    设置 建议的值 说明
    应用名称 全局唯一名称 用于唯一标识新 Function App 的名称。
    订阅 选择订阅 要使用的 Azure 订阅。
    资源组 MyResourceGroup 要在其中创建 Function App 的资源组的名称。 选择“新建”创建新的资源组。
    应用服务计划 按应用服务计划运行时,必须管理函数应用的缩放
    存储帐户 常规用途存储帐户 Functions 运行时需要 Azure 存储帐户。 单击“新建”创建一个常规用途存储帐户。 也可使用符合存储帐户要求的现有帐户。
  5. 单击“创建”以使用这些设置在 Azure 中创建函数应用和相关资源,并部署函数项目代码。

  6. 完成部署后,请记下“站点 URL”值,这是函数应用在 Azure 中的地址。

    发布成功消息

函数应用设置

还必须将在 local.settings.json 中添加的任何设置添加到 Azure 函数应用中。 发布项目时,不会自动上传这些设置。

将所需设置上传到 Azure 中的函数应用的最简单方法是使用“管理应用程序设置...”链接(在成功发布项目之后显示)。

这会显示用于函数应用的“应用程序设置”对话框,可以在其中添加新应用程序设置或修改现有设置。

本地表示 local.settings.json 文件中的设置值,远程是 Azure 的函数应用中的当前设置。 选择“添加设置”以创建新的应用设置。 使用“从本地插入值”链接将设置值复制到“远程”字段。 你选择“确定”后,挂起的更改将写入本地设置文件和函数应用。

还可以采用以下这些其他方法之一来管理应用程序设置:

后续步骤

若要详细了解 Azure Functions 核心工具,请参阅在本地编写 Azure 函数代码并对其进行测试

若要了解有关以 .NET 类库开发函数的详细信息,请参阅 Azure Functions C# 开发人员参考。 本文还举例说明了如何使用属性来声明 Azure Functions 支持的各种类型的绑定。