标记存档:dotnet

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

我已经使用了一段时间的Visual Studio代码的Azure函数,它们继续以很好的方式发展。最近的一次换班让我陷入了一个循环,所以我想我会为那些还没有开始的人记录一些。我还应该指出,在过去一年左右的时间里,我一直专注于用JavaScript编写函数,因为我喜欢把事情搞混一点,这也使得与不以.NET为中心的开发人员共享Azure函数更加容易。

我也写过关于在msdn杂志上用vs代码创建Azure函数的文章,但同样,自从我写这篇文章以来,情况就变了。我已经使用了一段时间的版本2 API,所以我没有说话(好吧,写)关于从v1到v2的变化,以及使用Azure函数扩展的体验的变化。

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

在对文档进行了足够多次的重新访问后,最终发现了一些关键信息,我意识到,随着与C合作的扩展,体验发生了变化。以前,我曾经使用过C脚本函数(.csx),这与您直接在门户中工作时使用的相同。但是扩展模板现在驱动您使用C项目功能,这有很大的不同。脚本函数更像是javascript函数。它们依赖于手动创建的function.json文件来定义绑定,并可以基于绑定安装适当的扩展包。CSX文件在运行时编译。有了C类库,您可以像开发其他C类库一样进行开发——安装相关的包,然后使用属性将方法标识为Azure函数和触发器,输入和输出绑定。编译库时,Azure函数工具将为您生成一个被部署的function.json文件。

因为我习惯于用javascript或脚本路径创建函数,使用C类库的Azure函数扩展的新默认值确实让我陷入了一个循环。因此,我决定用文档记录在这个工作流程中行走,因为我必须学习它。我想我还是更喜欢重量较轻的C脚本(.csx)或JavaScript流,但这可能与我在许多情况下对vs代码的偏好相一致,而不是Visual Studio。

编写Visual Studio代码

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

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

然后你可以点击“创建新项目”功能栏上的图标(当您将鼠标悬停在功能栏上时,图标会显示出来),以便在文件夹中创建新的功能应用程序项目。

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

工作流的此部分未更改。

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

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

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

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

         
          
           
            NETCOREAPP2.1
           
           
            
             v2
            
          
          
           
            
          
          
           
            
             保护西部
            
           
           
            
             保护西部
            
            
             从未
            
           
          
         

在函数应用程序中创建一个函数,事情就大不一样了。

你总是从“添加函数”开始偶像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。最后,触发器模板列表过滤为“已验证”。

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

过滤器选项已验证,核心和所有。核心和所有当前显示相同的列表,其中包括一些额外的预览触发器:DurableFunctionsOrchestration,森德格尔事件hubtrigger和iothubtrigger。

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

过去我在.NET核心功能应用程序中创建了javascript函数,但现在我将继续使用C,因为这正是我真正感到惊讶的地方。我将选择httptrigger,然后系统会提示我提供一个名称。我只留下默认值:httptriggercsharp。然后要求我为将要创建的类提供一个名称空间名称。默认为“company.project”。我将把它改为functiontests.httptest1。要收集的最后一点信息是,您需要为函数选择安全性。选项中,我将选择匿名,因为它是一个演示,我不想处理凭证。

就是这样。将创建函数。

还有一些类库项目的差异

我过去的经验让我期望在app function文件夹中创建一个新文件夹,其中包含函数名和函数名,将是函数的类文件和包含绑定配置的function.json文件。类文件在那里(虽然不在它自己的文件夹中)。但是没有function.json文件。还有对我来说很有趣和新鲜的是run方法的functionname属性和run方法签名中httprequest的httptrigger属性。也,我不习惯在使用csx脚本时使用所有这些语句。2019年1月19日\u 15-16-45.png

在建设项目时,.NET核心读取该属性并构建一个进入bin文件夹进行部署的function.json。2019-01-17_22-38-03.png

但它不仅仅是熟悉的绑定。注意到generatedBy,配置源,脚本文件和入口点标记。

所以第一次装订,httpTrigger绑定,我看起来很熟悉。函数将响应httptrigger。

您可以通过运行或调试来测试这个默认值。奔跑,您可以使用vs code的ctrl-f5键盘组合键,或者,如果您喜欢使用CLI,使用azure函数cli命令:

主机启动

这将运行该函数并提供一个URL来尝试。模板“桩在地上”方法的编写目的是接受主体中的查询参数或JSON。我将使用一个查询参数:

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

以及浏览器输出

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

将输出绑定添加到
天青宇宙DB

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

为了使用与Azure Cosmos DB绑定的工作,我需要将相关包添加到我的项目中。因为我正在使用C类库构建我的函数,我可以像对任何其他nuget包那样这样做…直接将其添加到csproj或使用dotnet core cli添加包:

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

dotnet添加包microsoft.azure.webjobs.extensions.cosmossdb--版本3.0.3

注意,如果我使用javascript或c脚本构建函数,我需要使用工具cli(func extensions install-p)注册包包装名)。

现在这个包在csproj中:

          
           
            
           
          
恢复后,我可以添加输出绑定。当前默认函数是异步的,不能向异步方法添加参数。返回值是一种选择。见 https://docs.microsoft.com/en-us/azure/azure函数/函数使用函数返回值触发绑定详情。ICollector或IAsyncCollector是另一个( https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet类库写入多个输出值)。
但我要只是使run方法同步,并创建一个输出参数。就像触发器绑定参数一样,我需要向输出参数添加一个属性来指定绑定。我还提供数据库和集合名称的参数,具有到数据库帐户的连接字符串的设置的名称,以及最后一个确保在需要时创建数据库和集合的设置。
[FunctionName("HttpTriggerCSharp")]公共静态ActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous,“得到”,“邮政”route=null)]httprequest req,[COSMOSSDB(数据库名称:“CSharpDatabase”,collectionName:“CSharpCollection”,connectionStringsetting=“mycosmosdbconnection”,createifnotexists=true)]out动态文档,ILOGER日志
我添加了mycosmosdbconnection,它是在local.settings.json文件中定义的:
{“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;命名空间函数tests.httptest1公共静态类httptriggercsharp[函数名(“httptriggercsharp”)]公共静态操作结果运行([httptrigger(authorizationlevel.anonymous,“得到”,“邮政”route=null)]httprequest req,[COSMOSSDB(数据库名称:“CSharpDatabase”,collectionName:“CSharpCollection”,connectionStringsetting=“mycosmosdbconnection”,createifnotexists=true)]out动态文档,ilogger log)log.loginformation(“C HTTP触发器函数处理了一个请求”);字符串名称=请求查询[“名称”];document=新建name=名称,添加=datetime.now;返回名称!= NULL?(actionresult)新的OkObjectResult($你好,name”):new badRequestObjectResult(“请在查询字符串上传递名称”);} }
根据我以前手动配置function.json的经验,我以为建好房子后,bin文件夹中包含cosmossdb输出绑定信息的function.json,但没有。再一次,这是由于javascript/c脚本函数和c库函数之间的差异造成的。
在vs代码中,我可以运行或调试函数。调试是F5或调试图标。奔跑,没有调试,您可以使用CTRL-F5或工具CLI命令:
主机启动
使用cli命令时,我在测试中发现我使用的版本似乎需要我运行 清洁网首先是成功。ctrl-f5为您完成这一步。我在一个预先存在的GitHub问题中记录了这一点。你可以读到 在这里.
官方文件中有很多有用的信息。我所倚重的两件事是:

第一次进入。net Core 2.0

我必须从某个地方开始,所以我开始了wtih超级婴儿步骤。下载.NET核心2夜间版本并尝试创建一个简单的控制台应用程序。我马上就惨败了。原因何在?夜色中的建筑已经跃过鲨鱼!他们正在研究2.1.0,我不小心抓住了它。这对我来说有点太血腥了。

有一个码头工人形象你可以很容易地使用,但我想试试cli,vs代码和Visual Studio。所以我想把钻头安装在我的机器上。

我要给你们看的是我在macOS和Windows 10上做的第一个测试。我喜欢这样做只是为了确保事情的正常运行。注意,在macOS上,我刚在我的计算机上直接安装了这个新版本,在那里我有其他版本的.NET核心。关键是不存在依赖于其他版本的生产工作,所以我不会搞砸任何重要的事情。版本可以并排运行。只是对于像我这样“知道足够危险”的人来说,尽管我知道创建本地nuget.config文件以及在global.json中指定版本等技巧,但很容易与版本纠缠在一起。在Windows上,然而,我使用的是一个干净的虚拟机,它没有其他版本的。net。不管怎样,这是明智的做法。虽然我在我的机器上尝试了不太聪明的installig方法,它已经有各种版本的框架,甚至我的版本控制技巧,我无法让2.0.0进行还原或生成。

我在上面提到,我最初下载的SDK版本不正确。(请注意,典型的SDK安装还包括运行时…,所以我得到了两者的错误版本。你可以在本期Github我在解决问题时不断更新。)我想坚持使用.NET核心2.0.0。它的安装程序隐藏在github.com/dotnet/cli的一个分支中,而不是从主服务器获取绝对最新的版本。而是转到https://github.com/dotnet/cli/tree/release/2.0.0。有一个稳定的2.0.0版本-2.0.0-预览2-006391。这是我在Windows和MacOS上使用的。

2017 - 06 - 11 - _12 23 - 16. jpg

确保NuGet知道在哪里可以找到包

您可以在创建项目之前更新全局nuget.config。或者,您可以创建一个项目,然后向其中添加一个本地nuget.config文件。

在Mac上,位于[user]/.nuget/nuget的全局配置文件。这是一张截图,如果像我一样,MacOS不是您的主要平台,您仍然在为这些事情而奋斗。

2017年6月11日\12-32-15.jpg

在Windows中,在%appdata%\nuget\处。

我有一个链接到"配置NuGet行为“医生,当我忘记在哪里能找到它的时候。

我将这两个键添加到我的PackageSources部分:


           
           

现在是时候创建一个项目了

我在Mac上,所以,到终点站我们就去。

我创建了一个名为efcore20的新文件夹——我知道这是.NET核心,但最终我也计划加入EFcore2.0。
我的计划是创建一个.NET核心控制台应用程序(这将依赖于NetCoreApp2.0)和一个库。库将基于netstandard2.0库。这意味着它是一个我可以从各种各样的应用程序中使用的库,包括基于.NET 4.6.1的应用程序。EF Core 2.0也将依赖于。net标准2.0,所以任何应用程序或API都可以使用NetStandard,也可以使用ef core 2.0。阅读更多关于这方面的信息 在GitHub上发布EF Core 2.0公告.

我为EFCore20文件夹中的每一个创建了一个文件夹:

netcore2console
网络标准2LIB

然后我进入netcore2console应用程序,用以下命令创建该应用程序:

Dotnet新控制台。
就这些。这就创建了一个小小的Hello World应用程序。dotnet new命令还将在创建文件后执行dotnet还原。这是你第一次看到事情是否再次发生。如果恢复失败,它会马上告诉你。
这是我在事情不对时得到的信息:
错误消息:错误MSB4236:找不到指定的SDK“microsoft.net.sdk”。
“指定的”SDK是您正在引用的SDK的当前安装版本。在我看来,dotnet enw控制台的默认值是“dotnetcore”版本是安装的任何版本。
最有可能的问题是您没有为dotnet提供正确的uri以查找正确的nuget包。
如果不想破坏全局配置,您可以使用应用程序在文件夹中创建本地nuget.config文件。整体而言,它看起来像:
           
           
            
             
             
            
           
即使dotnet new将调用restore,我喜欢打电话
网络还原
明确地。(控制狂)
如果恢复正确,那么验证的下一步是
dotnet构建
希望这也不会给你带来错误。它不应该。
最后,
网络游戏
会导致吐出
你好世界!
现在我知道它起作用了。有点傻,但我想在浪费时间写一堆不会运行的代码之前验证一下,因为我甚至没有正确安装.NET内核。
另一个关注点是dotnet新控制台创建的文件。
如果我把它们打开比较容易看到 Visual Studio代码我可以打字吗
代码。
只有2个文件。包含项目元数据和程序文件的csproj。csproj文件表示目标框架是netcoreapp2.0。

2017年6月11日

程序文件在启动时只吐出Hello World。
2017 - 06 - 11 - _14 10 - 17所示
以下是命令行中所有步骤的屏幕截图 Dotnet新控制台你好世界!输出包括我的额外 网络还原.我喜欢显式恢复的另一件事是它显示了关于恢复的更详细的信息。
2017年6月11日
接下来,我想确保我可以得到一个。net标准库也可以工作。
仍在终端(或控制台或PS,如果您在Windows上)我现在进入第二个子文件夹,ef core2/netstandard library.dotnet新库默认为对库使用netstandard。所以很容易。
dotnet新图书馆
将创建库并恢复它所需的包。
以下是这个新库的默认内容,再一次,显示在vs代码中。
antie that its csproj说目标框架是netstandard2.0。 2017年6月11日
有一个空的类文件。
2017年6月11日
我将修改这个类,添加一个返回字符串的公共方法:你好!.
2017年6月11日

现在,我将进入控制台应用程序的csproj,并给它一个库的项目参考。智能感知还没有?帮我做这件事,我的记忆糟透了*,所以我去了奈特·麦克马斯特的Handy Project.json去了CSproj的Mind Mapper,又名project.json到msbuild转换指南提醒自己项目引用的语法。我在控制台应用程序csproj文件的属性组部分下面添加了这个。

          
           
          
再次运行dotnet restore和dotnet build将有助于确定是否存在拼写错误。我经常这样做。
现在,我将修改program.cs文件,并从我的库中调用输出calling hiya方法的结果:
2017 - 06 - 11 - _14 - 31 - 39

然后回到我的终端窗口(尽管我也可以在VS Code的内置终端中完成)。我构建了这个库,然后切换到控制台文件夹。重建并运行它,就这样

γnetcore2console网络游戏

你好世界!

为什么,你好!

γnetcore2console

所以现在我知道.NET核心2(从夜间构建预览)正在我的计算机上正常运行,我可以创建和使用.NET标准2.0库。这意味着我可以继续并自信地开始创建一个.NET标准2.0库来承载一些EF核心2.0逻辑。

我也在我的Windows机器上重复了这整件事。这不仅让我知道我可以在那里使用这个版本的.NET核心,但我也将在带有.NET核心2.0预览的Visual Studio中做一些工作。

*(杜)我应该在vs代码中把自己变成一个片段!)

DotNet核心版本混乱

我看到人们经常为此挠头,所以把它扔在这里,尽管我确信它已经在很多地方被提到过。

当您在dotnet命令行(即cli-aka命令行界面)并键入“dotnet”时,将显示运行时的版本。

当您添加版本参数(“dotnet–version”)时,它将返回您正在使用的sdk版本(aka cli aka command line interface)。

下面是一个例子:

如果你感到困惑,你并不孤单。关于如何在dotnet–version应该显示什么?

改变EF核心与RTM的VS2017和工具

当Visual Studio 2017今天发布时,发生了一些与实体框架核心相关的其他事情。yabo官网

更多关于英孚核心的信息,看我的英孚核心:多元视野入门课程.

EF核心迁移工具发布

首先,我们为之做了准备,.NET核心SDK也发布了。最后一个稳定版本是1.0.0-preview2-1-003137。现在只是1.0.0。除了这个,它依赖的工具,还发布了用于PowerShell和dotnet的EF核心工具。随着.NET核心支持从project.json发展到msbuild,EF核心工具分离。我们已经使用了1.0.0-preview4(用于. net和project.json)和1.0.0-msbuild3(用于msbuild/csproj支持)。

现在工具包是1.1.0 (Tools)和1.0.0 (Tools. dotnet)

对于PowerShell支持:Microsoft.EntityFrameworkCore.Tools 1.1.0
对于dotnet cli支持:microsoft.entityframeworkcore.tools.dotnet 1.0.0

在Visual Studio 2015(针对完整的.NET项目)和Visual Studio 2017(此处显示,对于完整的.NET或.NET核心项目,包管理器将显示RTM版本:

形象

请注意,我没有“包括预发布”检查。

如果使用PMC进行安装,这只是

安装包microsoft.entityframeworkcore.tools

这是用于PowerShell工具的,否则,在名称中添加.dotnet。

但请注意,您不再需要添加–pre。

使用工具的CLI版本时,命令

dotnet ef–版本

结果

实体框架核心.NET命令行工具1.0.0-rtm-10308yabo官网

迁移命令的更改

随着预览工具的发展,一些细节改变了,例如,脚手架指挥变得更聪明了。

但值得注意的一个变化是类库中的ef核心。您仍然需要指向可执行项目(exe或test)来运行大多数命令,但现在你至少可以使用“dotneef”获取帮助文件而不必设置–startup项目参数。还有一些其他命令将在不了解启动项目的情况下运行。你可以在这个Github线程.查看brice lambson在开发命令时的一些评论。

EF核心1.1.1–补丁

这是释放的一个更微妙的部分。即使1.1.1 Github上的里程碑有30个错误修复都关闭了,没有人提到这会被推出去,里程碑上也没有目标日期。尽管我有我的怀疑!这是我3月5日拍摄的一张截图。

形象

是的,EF核心包的最新版本现在是1.1.1。这些是错误修复…正如增量所示。大多数是边缘案例,但无论如何,您一定要更新您的EF核心包,以确保您有这些最新的修复程序。如果你正在创建新项目,1.1.1您将看到Nuget提供的内容。

注意:在ef core 1.1.1中引入了一个回归,目标是用下一个补丁修复。您可以在此处阅读此问题:http://stackoverflow.com/questions/42708522/loading-relevant-data-aspnet-core-1-1

你可以在我的英孚核心:多元视野入门课程.