学习 Azure Functions: 在 Visual Studio 2017 中创建 Azure Functions






4.82/5 (25投票s)
如何在 Visual Studio 2017 中创建 Azure 函数。
目录
- 前言
- 引言
- Azure
- Azure Functions 和无服务器计算
- Azure 账户设置
- 设置开发环境
- 案例研究
- 在 Visual Studio 2017 中创建 Azure Function
- 将 Azure Functions 从 Visual Studio 发布到 Azure 门户
- 测试无服务器 Azure Functions
- 从 Visual Studio 调试 Azure Functions
- 结论
前言
本文是 CodeProject 的 Serverless Challenge 的投稿。比赛于 2019 年 3 月 11 日正式开始,并于 2019 年 4 月 30 日结束。
本文旨在帮助开发者了解 Azure Functions 是什么,如何在 Visual Studio 中创建 Azure Functions,以及如何在 Azure 上发布和测试函数。文章还将教授如何从 Visual Studio 调试已发布的 Azure Functions。
学习无服务器 Azure Functions
以下两篇文章将全面介绍 HTTP 触发的 Azure Functions、队列触发的 Azure Functions 和 Blob 触发的 Azure Functions。
引言
借助无服务器 Azure 的最新发展,Azure Functions 现在可以像任何其他 .NET 项目类型一样在 Visual Studio 中进行开发。这意味着我们在开发 Azure Functions 时可以使用熟悉的 Visual Studio 功能和工作流。我们可以在发布到云之前在本地编写、单元测试和调试函数代码。本文旨在涵盖 Azure Functions 的概念,即 Azure 支持的无服务器函数或预编译函数。
在这个学习 Azure Functions 的两篇文章系列中,我们将学习如何在 Visual Studio 中开始使用 Azure Functions,对 Azure Functions 进行高层次概述,并了解 Visual Studio 开发环境。我们将创建新的 Azure Functions 函数项目,学习如何在本地开发机器上运行此函数,以及如何直接从 Visual Studio 中将其发布到 Azure。一旦我们学会了如何创建基本函数,在接下来的文章中,我们将学习如何创建与不同 Azure 存储功能(如 Blob 和队列)配合使用的预编译函数。
Azure
Azure 是微软提供的云平台,提供了丰富的云计算资源。其中一项资源是虚拟机,即一台功能齐全的虚拟机,您可以根据自己的配置和操作系统选择,只需几秒钟即可创建。您可以使用安全的凭据远程访问该虚拟机,并执行任何您想进行的操作,例如托管网站、开发应用程序、为软件创建生产或测试环境等。让我们一步一步地了解如何实现这一点。
Azure Functions 和无服务器计算
关于定义,引自 此处
“Azure Functions 是托管在 Microsoft Azure 公有云上的无服务器计算服务。Azure Functions 和一般的无服务器计算旨在加速和简化应用程序开发。”
关于 Azure Functions 首先需要注意的是,它们运行在一个完全托管的环境中。这本质上意味着我们不必去创建或管理虚拟机。微软提供了所有 Azure Functions 所依赖的底层硬件,并对其进行配置。这样做的好处之一是,它提供了高可靠性,因为我们不必手动管理底层基础架构。另一个好处是,我们不必担心去为底层基础架构应用安全补丁。微软将为我们处理这些。但是,确保我们构建在 Azure Functions 之上的系统得到适当的安全和管理,则取决于我们自己。这个完全托管的环境的另一个好处是它提供了自动缩放。Azure Functions 平台将自动扩展我们的函数以应对传入请求量的变化。如果我们使用消耗计划执行 Azure Functions,那么我们只会在函数执行时付费。Azure Functions 的另一个好处是我们需要的样板代码更少,部分原因是我们可以在 Azure Functions 中轻松地与一系列 Azure 服务集成。例如,将我们的函数与 Azure Blob 存储集成,就像配置 C# 代码中的正确属性一样简单。
Azure 账户设置
如果没有付费的 Azure 账户,可以利用 Azure 的新账户福利,获得 200 美元的积分。这意味着如果您是 Azure 新用户并想尝试其免费试用,您将获得 200 美元的积分,可用于探索 Azure。如果您是 Azure 新用户且没有账户,请遵循以下流程,否则直接登录您的门户。
- 打开 Azure 网站,即 azure.microsoft.com。
- 点击“开始免费”以创建您的免费 Azure 账户并获得 200 美元的积分。
创建账户和领取 200 美元需要您的信用卡/借记卡仅用于验证目的,不会从您的卡中扣款。您可以使用此积分和账户玩 30 天。您将看到注册页面,在那里填写所有信息并逐步注册。成功注册后,您将看到门户链接,如下所示。
点击门户,您将进入仪表板,准备使用/探索 Azure。
设置开发环境
在开始编写 Azure Functions 之前,请确保我们相应地设置了开发环境。我们将在此处使用 Visual Studio 2017。您可以为本教程使用任何版本的 Visual Studio 2017。先决条件是在 Visual Studio 中启用 Azure 开发。您可以在 Visual Studio 安装本身中检查这一点,如下所示。
案例研究
在本篇文章中,我们将创建一个允许提交信用卡申请的函数。此函数将使用一个 HTTP 触发器,该触发器配置为仅允许 POST
请求。此 HTTP POST
将包含信用卡申请详情的 JSON。我们将通过 Azure 存储队列来解耦信用卡申请的接收与评分。因此,一旦此 HTTP 函数执行,申请将被返回到队列。然后,我们将创建一个处理申请的函数,该函数将从队列中获取此申请并确定信用卡申请是否成功。如果申请成功,那么我们将写入一个 Blob 到 Azure Blob 存储。此 Blob 将写入一个单独的已接受 Blob 容器,如果信用卡申请不成功,换句话说,被拒绝了,那么申请将被写入另一个 Blob 存储容器。然后,我们将创建一个已接受申请的函数来处理已接受的信用卡申请,我们还将创建一个被拒绝申请的函数来处理被拒绝的申请。
在 Visual Studio 2017 中创建 Azure Function
让我们按照步骤操作,创建一个 Azure Functions 项目并向其中添加 Azure Functions。最后,我们将把创建的 Azure Functions 发布到 Azure 门户。我们将创建一个模块,用于接受信用卡申请,并根据某些标准接受和拒绝申请。
添加 Azure Functions 项目
- 打开 Visual Studio 并创建一个新项目。
- 在项目模板类型列表中选择“云”,然后选择“Azure Functions”作为项目类型。为您的项目命名并点击“确定”。
- 首先,选择 **Empty** 作为项目类型,然后点击“确定”以创建项目。
- 完成后,项目将如下图所示。我在创建项目时给项目起名为“
LearnAzureFunctions
”,并在 Visual Studio 解决方案中显示为项目。
添加一个 HTTP 触发的 Azure Function
现在我们的 Azure Functions 项目已经准备好,我们可以向此项目添加多个函数。让我们开始添加这些函数以实现我们的案例研究目标。
- 右键单击项目并添加一个新的 Azure Function,如下图所示。
- 选择 Azure Function 作为类型,并为其命名,例如,在本例中为“
ApplyForCC
”。 - 选择 **Http trigger** 作为函数类型,在访问权限方面,您可能会看到几个选项。现在,选择仅将访问权限限制为 **Function** 的选项,然后点击“确定”。
- 完成后,我们将获得如下所示的函数。请注意,这是一个 HTTP 触发函数,可以通过浏览器或 API 客户端像 API 一样执行。如果我们仔细看,它有一个
FunctionName
属性,包含函数名称,以及返回 Http 响应(如 Web API)的Task
。Run
方法是调用此 API 时执行的方法,它将授权级别作为参数。由于我们将访问权限设置为“Function
”级别,它显示AuthorizationLevel.Function
,并且具有 HTTP 动词,如 GET 和 POST。该方法还将路由作为参数,请求和日志,即TraceWriter
类实例,用于在方法中写入日志,如方法中所示,当它说log.Info(“C# HTTP trigger function processed a request.”)。
以下是生成的完整类代码。该方法处理请求并期望请求中有一个“
name
”查询参数。如果找到“name
”查询参数,它将返回“OK
”响应,即200
,否则返回“Bad Request
”响应。using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Azure.WebJobs.Host; namespace LearnAzureFunctions { public static class ApplyForCC { [FunctionName(ApplyForCC)] public static async TaskHttpResponseMessage Run( [HttpTrigger(AuthorizationLevel.Function, get, post, Route = null)]HttpRequestMessage req, TraceWriter log) { log.Info(C# HTTP trigger function processed a request.); parse query parameter string name = req.GetQueryNameValuePairs() .FirstOrDefault(q = string.Compare(q.Key, name, true) == 0) .Value; if (name == null) { Get request body dynamic data = await req.Content.ReadAsAsyncobject(); name = data.name; } return name == null req.CreateResponse(HttpStatusCode.BadRequest, Please pass a name on the query string or in the request body) req.CreateResponse(HttpStatusCode.OK, Hello + name); } } }
- 让我们稍微修改一下该方法,使其仅接受 post 请求,因此从参数列表中删除“
Get
”属性,如下所示。 - 现在,编译应用程序并通过点击下方显示的“箭头操作按钮”或按 **F5** 运行应用程序。
- 一旦函数处于运行模式,将启动 func.exe 控制台窗口。如果您仔细观察,它会显示找到新函数
LearnAzureFunctions.ApplyForCC.Run
的详细信息,并且在作业主机启动后,它会显示我们的ApplyForCC
函数的终结点。我们可以使用POST
请求通过任何 Web API 客户端(如 Postman)来测试这个终结点。我们将在下一节中进行。
使用 Postman 测试和调试 HTTP 触发的函数
- 应用程序启动并运行时,我们可以通过 Postman 测试我们的函数。如果您没有 Postman 应用程序,请安装它以测试 API 调用。安装应用程序后,从开始菜单打开该应用程序,如下所示。
- 从控制台窗口获取函数 URL,并进行
POST
请求,如下所示。请注意,我们收到了 404 错误请求。如果您还记得,错误来自Run
方法,因为没有提供名为“name
”的参数。 - 让我们纠正这个请求,并使用
name
参数进行请求。因此,追加查询字符串name = “Akhil”
并按发送。请注意,我们收到了200
,即OK
响应,响应文本为“Hello Akhil
”。所以我们的 Azure 函数在本地可以工作。 - 现在,如果您检查控制台窗口,我们会看到请求和响应在那里显示“
ApplyForCC
”正在执行,并且执行后,显示“Executed
”以及发送的响应。 - 您还可以通过在函数中放置断点并发出请求来调试方法。我们看到 name 参数设置为“
Akhil
”,如下所示。
介绍模型
我们的 HTTP 触发器工作正常。我们现在将介绍一个模型,即信用卡申请模型,该模型将被我们的 Azure Function 作为输入,并相应地处理该申请。
- 添加一个名为
CCApplication
的新类,并添加以下代码,即类及其属性。namespace LearnAzureFunctions { public class CCApplication { public string Name { get; set; } public int Age { get; set; } public string Occupation { get; set; } public float YearlyIncome { get; set; } } }
我们的解决方案看起来与下图完全相同。
- 在 Azure Function 中做一些修改。从请求中读取信用卡申请模型,记录申请中人员的姓名,并返回响应,表示已收到该姓名的信用卡申请。运行应用程序,以便在测试之前启动控制台窗口。
以下是实现的说明性代码。
using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Azure.WebJobs.Host; namespace LearnAzureFunctions { public static class ApplyForCC { [FunctionName("ApplyForCC")] public static async Task<HttpResponseMessage> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log) { log.Info("C# HTTP trigger function processed a request."); CCApplication ccApplication = await req.Content.ReadAsAsync<CCApplication>(); log.Info($"Received Credit Card Application from : {ccApplication.Name }"); return req.CreateResponse(HttpStatusCode.OK, $"Application received and submitted for {ccApplication.Name}"); } } }
- 现在再次返回 Postman 测试此函数。这次,函数不需要查询参数,而是需要请求正文中的模型。因此,在请求正文中定义一个 JSON,然后像以前一样以
POST
方式发送请求。 - 您可以在方法中放置调试器以检查收到的请求的参数。正如我们在下图中所见。
- 现在回到 Postman,我们得到了预期的响应,即已收到姓名在模型中的申请,即在本例中为“
Akhil Mittal
”。
将 Azure Functions 从 Visual Studio 发布到 Azure 门户
现在是时候将 Visual Studio 中开发的本地函数发布为 Azure 门户中的 Function App 了。确保您拥有 Azure 账户并已登录门户。
- 右键单击项目,您将在上下文菜单中看到“发布”选项。点击该选项。
- 在下一个屏幕上,如果您是第一次发布,请保留如下图所示的单选按钮选择。或者,如果您正在发布现有应用程序,您可以选择“选择现有”单选按钮。将发布目标选择为“Azure Function App”,然后点击 **Publish**。
- 如果您已登录 Visual Studio 中的 Microsoft 帐户,则没问题;否则,它会要求您在继续之前登录 Microsoft 帐户以访问 Azure 门户服务。下一步将要求您在发布函数之前提供 App Service 配置。
- 提供函数名称,订阅应自动填充,资源组(您可以创建新组或使用现有组)。选择一个托管计划,为其命名,例如“
CCAppFunctionPlan
”,位置为“Central US
”,我选择了大小为“Consumption
”,如下图所示。如果我们选择消耗计划,请注意这里的警告,它告诉我们消耗 App Service 计划仅适用于 Function Apps,但这没关系,因为我们正在创建一个 Function App。这意味着我们只会在函数执行时收费。点击 **OK**,最后,我们可以选择一个现有的存储账户,或者创建一个新的。所以,让我们创建一个新的存储账户。我们将这个存储账户命名为“ccappfunction
”,并保留账户类型为默认值。 - 现在,继续点击 **Create**,这将创建我们的 App Service,并将包括我们的
ApplyForCC
函数的函数应用部署到 Azure。发布完成后,将创建一个发布配置文件,如下所示。
- 转到 Azure 门户,在仪表板上,我们看到已成功创建了
CCAppFunction
App Service,以及ccappfunction
存储账户和CCAppFunctionPlan
服务计划。 - 双击
CCAppFunction
,即我们的 App Service,它可以包含多个函数。在本例中,到目前为止它只包含一个函数,即“ApplyForCC
”。在CCAppFunction
页面上,您会在左侧看到函数列表,展开后,您将看到ApplyForCC
函数。点击该函数,查看其详细信息。在概述页面,即函数的详细信息页面,您可以查看其状态为运行,以及函数的 URL。请记住,我们使用该终结点在本地测试函数时,现在 Azure 已将其公开。
测试无服务器 Azure Functions
如果我们点击 **Manage** 选项卡,我们可以看到几个密钥。如果我们回到 Visual Studio 并检查我们的函数,会看到我们将 AuthorizationLevel
设置为 Function
。这意味着当我们调用已部署到 Azure 的函数时,我们需要提供一个函数密钥。如果我们回到门户,可以看到我们有一个默认函数密钥已自动添加,如果我们愿意,我们可以添加其他函数密钥,并可以看到密钥值。
- 现在,再次点击
ApplyForCC
函数选项卡,通过点击“Get Function URL”链接获取函数 URL,如下所示。请注意,我们无法在此处更改函数定义,因为它是只读模式。任何需要更改的内容都应该在 Visual Studio 中完成,然后可以重新发布。 - 复制 URL。
- 返回 Postman,使用从门户复制的 Azure Function URL 创建一个新的
POST
请求。确保请求正文中包含我们之前提供的 JSON。 - 发送请求后,我们收到响应:“申请已收到并提交给 Akhil”。这表明我们在 Azure 上部署的函数实际上正在工作,并且我们正在获得响应。让我们检查一下。
- 回到门户,点击 **Monitor** 选项卡,我们看到成功计数显示为
1
。如果点击它,我们将看到我们函数的日志,即调用日志,其中显示了函数的详细信息,如持续时间、状态、上次运行时间和已执行的函数。 - 在日志部分(如下所示),我们可以看到我们自己在函数代码中进行的日志记录文本。
从 Visual Studio 调试 Azure Functions
我们将尝试在此处从 Visual Studio 调试已部署的 Azure Function。
- 回到 Visual Studio 并打开“Cloud Explorer”,如下图所示。
- 在列表中选择您的 Azure 订阅,然后点击 **AppServices**,我们看到我们的函数名出现了,即已部署在云上的函数。右键单击 **CCAppFunction**,然后点击 **Attach Debugger**。
- 调试器附加后,将启动一个浏览器,显示函数 URL,如下所示。
- 返回 Postman,再次使用函数应用的托管 URL 发出与之前相同的请求。
- 发送请求后,我们在 Visual Studio 的函数中命中调试器断点,这意味着我们正在调试该函数。您可以检查请求和请求正文中的参数。按 F5 继续。
- 在 Postman 中,我们看到收到的响应为
200
。
结论
在这篇详细的文章中,我们学习了 Azure Functions 和 Function Apps 是什么,如何在 Visual Studio 中本地编码、调试和测试 Azure Function,以及将其发布到 Azure 门户。我们学习了如何测试已部署的 Azure Function 并使用 Visual Studio 调试它。在 下一篇文章(这是续篇)中,我们将学习 存储队列和 Blob 存储。
祝您编码愉快!
历史
- 2019 年 4 月 2 日:初稿