使用 Visual Studio 将函数连接到 Azure 存储

无需编写自己的集成代码,即可使用 Azure Functions 将 Azure 服务和其他资源连接到函数。 这些绑定表示输入和输出,在函数定义中声明。 绑定中的数据作为参数提供给函数。 触发器是一种特殊类型的输入绑定。 尽管一个函数只有一个触发器,但它可以有多个输入和输出绑定。 有关详细信息,请参阅 Azure Functions 触发器和绑定的概念

本文介绍如何使用 Visual Studio 将在前一篇快速入门文章中创建的函数连接到 Azure 存储。 添加到此函数的输出绑定会将 HTTP 请求中的数据写入到 Azure 队列存储队列中的消息。

大多数绑定都需要一个存储的连接字符串,函数将使用该字符串来访问绑定的服务。 为便于操作,请使用连同函数应用一起创建的存储帐户。 与此帐户建立的连接已存储在名为 AzureWebJobsStorage 的应用设置中。

先决条件

在开始学习本文之前,必须:

下载函数应用设置

前一篇快速入门文章中,你已在 Azure 中创建了一个函数应用,并创建了所需的存储帐户。 此帐户的连接字符串安全存储在 Azure 中的应用设置内。 在本文中,你要将消息写入到同一帐户中的存储队列。 若要在本地运行函数时连接到该存储帐户,必须将应用设置下载到 local.settings.json 文件。

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

  2. 在“托管”下的“发布”选项卡中,展开三个点 (...) 并选择“管理 Azure 应用服务”设置。

    Edit the application settings

  3. 在“AzureWebJobsStorage”下,将“Remote”字符串值复制到“Local”,然后选择“确定”。

现在,使用 AzureWebJobsStorage 设置建立连接的存储绑定可以在本地运行时连接到队列存储。

注册绑定扩展

由于你使用的是队列存储输出绑定,因此在运行项目之前,需要安装存储绑定扩展。 绑定(HTTP 和计时器触发器除外)将实现为扩展包。

  1. 在“工具”菜单中,选择“NuGet 包管理器”>“包管理器控制台”。

  2. 在控制台中,运行以下 Install-Package 命令安装存储扩展:

    Install-Package /dotnet/api/microsoft.azure.webjobs.blobattribute.Queues -IncludePrerelease
    

现在,你可以将存储输出绑定添加到项目。

添加输出绑定

在 C# 项目中,绑定被定义为函数方法上的绑定属性。 具体定义取决于应用是在进程内(C# 类库)还是在隔离进程中运行。

打开 HttpExample.cs 项目文件,并将以下参数添加到 方法定义中:

            [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 

msg 参数为一个 ICollector<T> 类型,表示函数完成时写入到输出绑定的消息集合。 在这种情况下,输出是名为的 outqueue 存储队列。 StorageAccountAttribute 设置存储帐户的连接字符串。 此属性指示包含存储帐户连接字符串的设置,可以在类、方法或参数级别应用。 在本例中,可以省略 StorageAccountAttribute,因为你已使用默认存储帐户。

Run 方法定义现在必须如以下代码所示:

        [FunctionName("HttpExample")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, 
            [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
            ILogger log)

添加使用输出绑定的代码

定义绑定后,可以使用绑定的 name,将其作为函数签名中的属性进行访问。 使用输出绑定时,无需使用 Azure 存储 SDK 代码进行身份验证、获取队列引用或写入数据。 Functions 运行时和队列输出绑定将为你执行这些任务。

添加使用 msg 输出绑定对象来创建队列消息的代码。 请在方法返回之前添加此代码。

            if (!string.IsNullOrEmpty(name))
            {
                // Add a message to the output collection.
                msg.Add(name);
            }

此时,你的函数一定如下所示:

        [FunctionName("HttpExample")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, 
            [Queue("outqueue"),StorageAccount("AzureWebJobsStorage")] ICollector<string> msg, 
            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;

            if (!string.IsNullOrEmpty(name))
            {
                // Add a message to the output collection.
                msg.Add(name);
            }
            return name != null
                ? (ActionResult)new OkObjectResult($"Hello, {name}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }

在本地运行函数

  1. 若要运行函数,请在 Visual Studio 中按 F5。 你可能需要启用防火墙例外,这样工具才能处理 HTTP 请求。 在本地运行函数时,永远不会强制实施授权级别。

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

    Azure local runtime

  3. 将 HTTP 请求的 URL 粘贴到浏览器的地址栏。 将查询字符串 ?name=<YOUR_NAME> 追加到此 URL 并运行请求。 下图显示了浏览器中由函数返回的本地 GET 请求的响应:

    Function localhost response in the browser

  4. 若要停止调试,请在 Visual Studio 中按 Shift+F5

首次使用输出绑定时,Functions 运行时会在存储帐户中创建名为 outqueue 的新队列。 将使用存储资源管理器来验证队列是否与新消息一起创建。

将存储资源管理器连接到帐户

如果已安装 Azure 存储资源管理器并已将其连接到 Azure 帐户,请跳过此部分。

  1. 运行 Azure 存储资源管理器工具,选择左侧的连接图标,并选择“添加帐户”。

    Screenshot of how to add an Azure account to Azure Storage Explorer.

  2. 在“连接”对话框中,依次选择“添加 Azure 帐户”、你的 Azure 环境和“登录...”。

    Screenshot of the sign-in to your Azure account window.

成功登录到帐户后,将看到与你的帐户关联的所有 Azure 订阅。 选择你的订阅并选择“打开资源管理器”。

检查输出队列

  1. 在存储资源管理器中,展开“队列”节点,然后选择名为 outqueue 的队列。

    此队列包含在运行 HTTP 触发的函数时队列输出绑定创建的消息。 如果使用 Azure 的默认 name 值调用了此函数,则队列消息为“传递给函数的名称: Azure”。

    Screenshot of the queue message shown in Azure Storage Explorer.

  2. 再次运行函数,发送另一个请求,此时会看到新消息出现在队列中。

现在,可将更新的函数应用重新发布到 Azure。

重新部署并验证更新的应用

  1. 在“解决方案资源管理器”中,右键单击项目并选择“发布”,然后选择“发布”将项目重新发布到 Azure。

  2. 部署完成后,可以再次使用浏览器测试重新部署的函数。 如前所述,请在 URL 的后面追加查询字符串 &name=<yourname>

  3. 可以查看存储队列中的消息,以再次确认输出绑定是否在队列中生成了新的消息。

清理资源

本教程系列中的其他快速入门教程是在本文的基础上制作的。 如果打算使用后续的快速入门、教程或者在本快速入门中创建的任何服务,请勿清理这些资源。

Azure 中的资源是指函数应用、函数、存储帐户等。 这些资源可以组合到资源组中,删除该组即可删除组中的所有内容。

你已创建完成这些快速入门所需的资源。 这些资源可能需要付费,具体取决于帐户状态服务定价。 如果不再需要这些资源,请参阅下面介绍的资源删除方法:

  1. 在 Azure 门户中转到“资源组”页。

    若要从函数应用页转到该页,请选择“概览”选项卡,然后选择“资源组”下的链接。

    Screenshot that shows select the resource group to delete from the function app page.

    若要从仪表板转到该页,请选择“资源组”,然后选择用于本文的资源组。

  2. 在“资源组”页中查看所包括的资源的列表,然后验证这些资源是否是要删除的。

  3. 选择“删除资源组”,然后按说明操作。

    删除操作可能需要几分钟。 完成后会显示一个通知,持续数秒。 也可以选择页面顶部的钟形图标来查看通知。

后续步骤

现已更新 HTTP 触发的函数,使其将数据写入存储队列。 若要详细了解如何开发 Functions,请参阅使用 Visual Studio 开发 Azure Functions

接下来,应为函数应用启用 Application Insights 监视: