在Visual Studio代码中构建基于c#项目的Azure函数

我在Visual Studio代码中使用Azure函数已经有一段时间了,它们还在以非常好的方式发展。最近的轮班让我陷入了一个循环,所以我想我应该为那些可能还没有开始的人编写一些文档。我还应该声明,在过去一年左右的时间里,我一直专注于用JavaScript编写函数,因为我喜欢将一些东西混在一起,而且这也使得与不专注于. net的开发人员共享Azure函数变得更加容易。

我还在MSDN杂志上写过用VS代码创建Azure函数的文章,自从我写了这篇文章以来,情况已经发生了变化。我已经使用版本2的api有一段时间了,所以我不打算讨论(好吧,写)关于从v1到v2的变化,以及使用Azure函数扩展的体验的变化。

同样值得注意的是,Azure功能团队实际上推荐使用Visual Studio来构建基于c#的应用程序和用于JavaScript的VS代码。但是我经常在我的MacBook上,并且喜欢使用VS代码,所以我无论如何都要用c#沿着这条路走下去。

重新看了足够多的文档,终于注意到了一些关键信息,我意识到为什么使用c#的扩展会改变这种体验。在此之前,我使用过c#脚本函数(.csx),它与直接在门户中工作时使用的脚本函数相同。但是扩展模板现在驱动您使用c#项目函数,这是一个很大的区别。c#脚本函数更像javascript函数。They depend on a manually created function.json file to define the bindings and can install the appropriate extension packages based on the bindings.csx文件在运行时编译。使用c#类库,您可以像开发其他c#类库一样开发——安装相关的包,然后使用属性来标识方法,如Azure函数和触发器,输入和输出绑定。编译库时,the Azure Functions tooling will generate a function.json file for you that gets deployed.

因为我习惯用JavaScript或c#脚本路径创建函数,Azure函数扩展使用c#类库的新默认值实际上让我陷入了一个循环。所以我决定记录下我必须学习的工作流程。我想我仍然更喜欢轻量级的c#脚本(.csx)或JavaScript流,但这可能与我在许多VS代码场景中的偏好一致,而不是Visual Studio。

编写Visual Studio代码

所以首先要做的是:您需要安装Azure的功能Azure帐户扩展到VS代码,Azure函数扩展依赖于Azure函数核心工具。扩展安装说明将帮助您获得所需的所有内容,扩展会检查更新并提示您根据需要更新这些工具。事实上,我昨晚收到这个提示。2019 - 01 - 16 - _09 - 28 - 10. png

安装了扩展之后,现在是创建一个函数应用程序项目的时候了。您应该已经创建了一个文件夹来存放您的项目,您也可以在VS代码中打开它。我的名字叫AzureFunctionProj。

然后点击“新建项目”在功能栏上的图标(当您将鼠标悬停在功能栏上时,图标会出现),用于在文件夹中创建一个新的功能应用程序项目。

2019 - 01 - 17 - _18 - 11 - 39. png

工作流的这一部分没有更改。

  1. 它会要求你指向一个文件夹,打开的文件夹应该在那里作为默认选择。
  2. 然后它会让你选择一种你将在你的应用程序中使用的语言。从选项(c#,JavaScript,Python(仍然是预览版)和Java(也是预览版),我将选择c#。

因此,一个新的。net核心项目将使用模板创建,您将在文件夹资源管理器中看到以下内容:

2019 - 01 - 17 - _18 - 19 - 58. png

AzureFunctionProj文件夹中的所有这些文件都是由模板创建的。最重要的是csproj文件,我在其中突出显示了一些最相关的设置。

         
          
           
            netcoreapp2.1
           
           
            
             v2
            
          
          
           
            
          
          
           
            
             PreserveNewest
            
           
           
            
             PreserveNewest
            
            
             从来没有
            
           
          
         

在函数应用程序中创建函数是非常不同的。

像往常一样,以"add a function"开头图标2019 - 01 - 17 - _18 - 11 - 39 copy.png

第一步很熟悉,选择哪个文件夹有函数应用程序,函数应该在:

2019 - 01 - 17 - _22 - 06 - 37. - png

我将选择AzureFunctionProj。

此外,还有许多触发器模板可供选择,但更有趣的是底部的三个选项:

2019 - 01 - 17 - _16 - 42 - 25. png首先是项目运行时,我肯定想要v2(“~2”)。你可以在函数应用中为不同的函数使用不同的语言。这显示了我已经选择的默认值:c#。最后,触发器模板列表筛选为“已验证”。

您可以通过单击这些选项来更改它们。

过滤器选项被验证,核心和所有。Core和All目前都显示了相同的列表,其中包括一些额外的预览触发器:DurableFunctionsOrchestration,SendGrid,EventHubTrigger IotHubTrigger。

2019 - 01 - 17 - _16 - 43 - 20. png

过去我在。net核心函数应用程序中创建JavaScript函数,但现在我将继续使用c#,因为这是真正让我吃惊的地方。我将选择HttpTrigger,然后提示我提供一个名称。我将保留默认值:HttpTriggerCSharp。然后,我被要求为将要创建的类提供一个名称空间名称。默认设置是“Company.Project”。我将它更改为FunctionTests.HttpTest1。要收集的最后一点信息是,您需要为函数选择安全性。的选项,我将选择匿名,因为这是一个演示,我不想处理凭证。

就是这样。函数被创建。

更多的类库项目差异

我过去的经验告诉我,在app function文件夹中创建一个新文件夹,里面有函数名,would be a class file for the function and a function.json file to contain the binding configurations.类文件在那里(虽然不在它自己的文件夹中)。But there was no function.json file.对我来说,运行方法上的FunctionName属性和运行方法签名中的HttpRequest上的HttpTrigger属性也是有趣的和新的。同时,我不习惯在使用csx脚本时使用所有这些语句。2019 - 01 - 19 - _15 - 16 - 45. png

在构建项目时,.NET Core reads that attribute and builds a function.json that goes in the bin folder for deployment.2019 - 01 - 17 - _22 - 38 - 03. png

但这不仅仅是熟悉的绑定。注意到generatedBy,configurationSource,scriptFile和entryPoint标记。

第一个绑定,httpTrigger绑定,看起来很眼熟。该函数将响应httpTrigger。

您可以通过运行或调试来测试这个默认值。运行,你可以使用VS Code的CTRL-F5键盘组合,如果你更喜欢使用CLI,使用Azure函数CLI命令:

func主机开始

这将运行该函数并提供一个url进行尝试。模板“赌注”方法被编写为在主体中接受查询参数或JSON。我将使用一个查询参数:

http://localhost:7071/api/HttpTriggerCSharp?name=Julie

浏览器输出

2019 - 01 - 19 - _15 - 57 - 04. png

添加输出绑定到
Azure宇宙DB

如果我想添加一个输出绑定呢?我习惯通过编辑function.json来实现这一点。但是因为我在属性定义绑定的路径上,我将这样添加绑定。让我们为Azure Cosmos DB添加一个输出绑定。这样,该函数将响应HTTP请求并将一些数据插入Cosmos DB数据库。我已经有一个Azure Cosmos DB账号了,因此,我将定义它来针对现有帐户中的新数据库中的新集合。

为了使用Azure Cosmos DB绑定,我需要将相关的包添加到我的项目中。因为我使用c#类库来构建函数,我可以这样做,就像我对任何其他Nuget包…直接添加到csproj或添加包与dotnet核心CLI:

但是现在我正在编写一个c#类库,这样我就可以使用dotnet CLI添加包,或者手动将它添加到.csproj中。我会使用CLI:

dotnet add package Microsoft.Azure.WebJobs.Extensions.CosmosDB --version 3.0.3

注意,如果我用JavaScript或c#脚本构建函数,我需要使用CLI (func extensions install -p)工具注册这个包packagename)。

现在包在csproj:

          
           
            
           
          
恢复后,我可以添加输出绑定。目前默认函数是异步的,您不能向异步方法添加参数。返回值是一种选择。看到 https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings#using-the-function-return-value获取详细信息。ICollector或IAsyncCollector是另一个( https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#writing-multiple-output-values)。
但是我将使Run方法同步并创建一个输出参数。就像触发器绑定参数一样,我需要向输出参数添加一个属性来指定绑定。我还为数据库和集合名提供参数,具有到数据库帐户的连接字符串的设置的名称,以及确保在需要时创建数据库和集合的最后一个设置。
[FunctionName("HttpTriggerCSharp")]公共静态ActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous,“得到”,“文章”,HttpRequest req,[CosmosDB(数据库名:“CSharpDatabase”,collectionName:“CSharpCollection”,ConnectionStringSetting = " MyCosmosDBConnection ",CreateIfNotExists=true)] out dynamic document,ILogger实例日志)
I added the MyCosmosDBConnection is defined in the local.settings.json file:
{“IsEncrypted”:假的,"Values": {"AzureWebJobsStorage": "",:“FUNCTIONS_WORKER_RUNTIME dotnet”,“MyCosmosDBConnection”:“这是我的连接字符串的位置",}}
注意,如果您使用Azure Cosmos DB触发器创建一个新函数,工具会提示您输入所有相关的数据库信息,在函数代码中包含该属性,并将其添加到function.json中。
现在只有最后一块拼图了。该函数希望我为文档变量提供一个值,然后绑定将该值插入数据库。下面是完整的类清单,其中用红色突出显示了用名称和添加属性填充文档的一行。函数和绑定将完成剩下的所有工作。
使用系统;使用Microsoft.AspNetCore.Mvc;使用Microsoft.Azure.WebJobs;使用Microsoft.Azure.WebJobs.Extensions.Http;使用Microsoft.AspNetCore.Http;使用Microsoft.Extensions.Logging;namespace FunctionTests.HttpTest1  {    public static class HttpTriggerCSharp    {      [FunctionName("HttpTriggerCSharp")]      public static ActionResult Run(        [HttpTrigger(AuthorizationLevel.Anonymous,“得到”,“文章”,HttpRequest req,[CosmosDB(数据库名:“CSharpDatabase”,collectionName:“CSharpCollection”,ConnectionStringSetting = " MyCosmosDBConnection ",CreateIfNotExists=true)] out dynamic document,ILogger log)      {        log.LogInformation("C# HTTP trigger function processed a request.");string name = req.Query["name"];document=new {Name = Name,Added = DateTime.Now };返回name != null?(ActionResult)新OkObjectResult($“你好,: new BadRequestObjectResult(“请在查询字符串上传递一个名称”);}}}
根据我之前手工配置function.json的经验,我以为建好房子后,the function.json in the bin folder to include the CosmosDB output binding information but it didn't.再一次,这是由于JavaScript/ c#脚本函数和c#库函数之间的差异造成的。
在VS代码中,我可以运行或调试函数。Debug是F5或Debug图标。运行,如果没有调试,您可以使用CTRL-F5或工具CLI命令:
func主机开始
当使用CLI命令时,我在测试中发现,我正在使用的版本似乎需要我运行 dotnet清洁首先要让它成功。CTRL-F5为您执行这个步骤。我在一个预先存在的GitHub问题中记录了这一点。你们可以读到 在这里
在官方文档中有很多有用的信息。我所倚重的两件事是:

ios万博体育app下载 报名参加我的通讯所以你不会错过我的会议和多元化视野课程公告!

关于“在Visual Studio代码中构建基于c#项目的Azure函数

  1. 非常感谢这个非常有用的帖子,朱莉!我打算重新开发一个v1功能应用程序,这是我大约一年前在VS2017开始的。你知道是否有可能在VS代码中获得这样的项目吗?或者我需要。net Core land吗?再次感谢!

    1. VS代码不能支持普通的。net框架项目。如果您将项目升级为使用v2(基于.NET Core),当然,你也可以在VS代码中使用它(在windows、Mac或linux上)。很抱歉回复晚了。我的电子邮件里没有。

留下一个回复

您的电子邮件地址将不会被公布。必填字段已标记*

这个站点使用Akismet来减少垃圾邮件。了解如何处理您的评论数据