在运行时在Azure上迁移EF核心的快速提示

关于我的英孚核心2入门课程的一个问题是:

嗨,朱莉
谢谢你的课程。我有个问题。请您建议将代码首次迁移部署到生产数据库(Azure)的最佳做法是什么?我是说我创造了
ASP.NET使用代码优先迁移方法的核心MVC和EF.core应用程序。在部署到Azure之后。如果我在代码优先方法中更改任何模式,我如何在生产数据库中更新模式(而不丢失生产数据库中的数据)

我对一些我认为值得在课程讨论之外分享的想法的回应。(请注意,这只是高级别)

为了简单的解决,我使用的一个路径是在启动时调用database.migrate。VS发布工作流有一个选项,您可以在发布应用程序时选中该选项以应用迁移。您可以在MS文档中看到将aspnet核心应用程序部署到Azure

或者您可以在program.cs文件中进行编程,该文件将执行任何需要的迁移。我的A中有一个这样的例子2019年4月《MSDN杂志》文章.如果你需要更强壮的东西,然后,您可以用ef核心迁移生成脚本(可能是等量脚本),然后将它们包含在更新中,并使用可以应用这些脚本的工具。如果你使用红门工具,也许他们SQL更改自动化工具。另一种工具是像FlywayDB这样的迁移工具(飞行路线)或液体数据库。我用过带集装箱的飞机跑道。这是我最近在使用它的地方做的一个会议演讲:LY/30AHGAR

发布一个包含VS2017机密的单一Image Docker容器并在Azure上运行它

(事先书面,但在5月2日相关文章最终出版时出版。)

我刚刚完成了一个由三部分组成的系列文章,内容是构建一个容器化的ASP.NET核心API,该API使用EF核心进行数据持久化。所有这些都是在vs 2017中完成的,我利用了docker的vs2017工具。

该系列文章将于今年4月出版。5月和6月出版的《MSDN杂志》。

第1部分:码头集装箱化应用程序中的ef核心,APR 2019

第2部分:码头集装箱化应用程序中的ef核心,2019年5月

但是我没有足够的空间来包含部署我写的应用程序的重要任务,尽管我努力工作。好,部署非常简单,但是为了处理存储用于连接到我的Azure SQL数据库的密码,还有一些新的步骤需要完成。我将在这篇博文中转达这些步骤。

我的API使用EF核心并以一个Azure SQL数据库为目标。所以不管我是在本地用IIS还是Kestrel调试,在Docker容器内进行本地调试或从服务器或云运行应用程序,我总能访问那个数据库。

这意味着我有一个要处理的连接字符串,但我想对密码保密。

解决方案的结构在这里。我的ASP.NET核心API项目是DataApidocker。因为我使用Docker工具添加容器编排,我在解决方案中还有一个文件夹用于Docker Compose。

形象

我将在本文的第2部分(2019年5月的一期)中详细介绍,但底线是在docker-compose.yml文件中使用docker环境变量。

版本:“3.4”

服务:
dataapidocker:
图片:$Docker_Registry-DataApidocker
建造:
语境:
dockerfile:dataapidocker/dockerfile
环境:
-DPBY-PW

在环境映射中,我有一个序列项,我在其中定义db_pw键,但不包括值。因为那里没有价值,Docker将查看主机的环境变量。因为我只是在调试,我在系统上用密码值创建了一个临时环境变量,当我从VS2017调试或运行应用程序时,将找到密码变量。该环境变量被传递到正在运行的容器中,我的应用程序具有读取该变量的代码,并将该密码包含在连接字符串中。

所以它是独立的,漂亮整洁。

将图像发布到Azure的ACI注册表

一旦你的应用程序运行起来了,是时候发布它了。但我们用的是Docker,所以你不发布应用程序,但可以为你运行应用程序的Docker图像。Docker工具也会对此有所帮助。

右键单击项目并选择“发布”。

形象

然后您将要创建发布配置文件。这个配置文件的一部分是选择发布图像的位置。这里你有选择。我有一个Visual Studio订阅,如果我想要,可以将它发布到一个Azure容器注册表,或者发布到Docker Hub或其他注册表。

形象

我写这篇博文的目的是把图片放到Azure容器注册表中,所以这是我的选择。您的Azure帐户中可以有多个容器注册。您可以在一个注册表中存储任意数量的图像。好,可能存在技术或财务限制,但关键是,一个注册表中可以有多个图像。我不是来这里为如何管理Azure财务提供建议的,如何完成任务。

这是我让发布工具为我创建的注册表的概述页面。我圈出了链接,以查看可以访问您的图像的存储库。

形象

您可能有不同版本的特定图像,因此每个“集”是不同的存储库。我有三个储存库,我一直在试验。

形象

DataAPI只有一个图像,发布工具自动将其标记为“最新”为了我。我可以在不同的标签下有其他版本。

回到Visual Studio,在浏览了发布工具关于创建新存储库的问题之后,最后一步是进行发布,发布将构建图像并将其推送到目标存储库。请记住,您希望将VS2017设置为运行版本构建,不是调试版本。

如果这是您第一次将此图像推送到存储库,该工具还将推送应用程序DockerFile中列出的ASP.NET核心SDK和运行时映像。

我很惊讶看到这个,想知道为什么Azure不只是从Docker Hub上获取它们,为什么我要直接上传那些大文件。当然,我在推特上表达了我的困惑:

故事还有很多,但它超出了我在这里的目标范围。

这个注册表的一个很酷的功能是您可以右键单击并运行一个图像。如果你不想安排一些图像,这很好,而且与我的情况相匹配。此图像确实独立运行。

右键单击图像并选择“运行实例”。Azure将创建一个容器并将其作为Azure容器实例.尽管首先需要为实例定义规范。

形象

这有点不可思议,因为如果容器是一个简单的应用程序,您不必创建和管理一个虚拟机来运行它。

容器实例的环境变量如何?

该实例将运行,但需要从Azure SQL数据库中读取的杂志控制器将失败,因为我们没有提供容器希望通过主机的环境变量提供的密码。所以为了我的形象,右键单击并运行还不够。

在这里我要读很多书,研究和实验,直到我找到解决方案。(请记住,如果我在自己设计的虚拟机上运行此程序,当您手动调用docker run时,只需传入变量即可。)

有两种方法可以为容器实例提供环境变量。

一,通过入口,表示不是右键单击图像,您需要首先在Azure中创建一个新的容器实例并指向该映像。此路径允许您在配置中最多分配3个环境变量:
形象

使用动态变量传递到容器中

我将进行第一次传递,创建一个动态变量以传递给environmentvariable。然后我会教你如何使用Azure密钥库

environmentvariable需要哈希表。

创建一个新的变量(我将称之为envvars,以纪念我学习到的资源),并分配一个键值对:

$envvars=@'db_pw'='eiluj'

另一个棘手的部分是提供访问注册表中映像的凭据。在使用门户创建容器时,我们不必这样做,因为我们已经提供了容器。但现在我需要提供它们。

您需要存储库中的用户名和密码:

然后,可以使用PowerShell根据密码创建安全字符串,然后使用该安全字符串和用户名创建PowerShell凭据对象。

提示:如果您有多个订阅,确保指向的是目标资源组所在的位置。

提示:在云shell中可以做的一件很酷的事情是,键入dir列出您的订阅,然后使用cd进入正确的订阅!结帐PowerShell云外壳快速启动详情

.

小贴士:如果像我一样,为了体验因果关系,你把数据库搞得一团糟,记住在我的示例代码中,在应用程序启动时迁移数据库。如果将它放在容器中,这意味着何时运行容器实例。所以如果你运行容器,然后删除数据库,在容器再次旋转之前,您不会再次看到数据库。停止和重新启动具有相同的效果。当然,这只是为了测试一下,不生产!再一次,有件事让我困了一个多小时,直到我有了一个“啊哈”的时刻。

创建一个密钥库并添加我的密码

关于我即将举行的交付敏捷会议的视频

下周我将在敏捷联盟技术会议上亚博国际网页发言,在田纳西州纳什维尔实现敏捷.我的演讲题目是“用Docker开发和测试数据库的敏捷性”。我和田径运动主席理查德·血清素谈了这个话题。

yabo官网Julie Lerman Deliver:2019年敏捷采访Richard Serater敏捷联盟维米欧.

链接到我最近的ddd+efcore内容

我所创建的各种文章和视频的聚合时间已经足够长了,其中包含了有关ef核心支持如何将域模型直接映射到关系数据库的课程,这些支持已经得到了改进:


关于docker compose中env文件的一个小教训

最近我和Docker一起工作了很多,学习学习。我已经为我的msdn mag数据点列那将在四月份推出,2019年5月和6月发行。我还有另一篇裕固族博客文章,我将在五月的文章中发表。我在研究其他人。

我研究了Docker环境变量以及将它们输入Docker映像或容器的不同方法。

我的docker compose文件引用了一个名为db_pw的环境变量,但没有指定其值。

dataapidocker:
图片:$Docker_Registry-DataApidocker
建造:
语境:
dockerfile:dataapidocker/dockerfile
环境:
-DPY-PW

Docker将从主机读取环境变量以发现该值。

但这是一种痛苦。我没有在开发机器上永久性地存储db_pw,必须经常记住设置它。EltonStoneman(来自Docker)说我真的应该考虑使用Docker env文件特性。这允许您在环境文件中设置变量,并让Docker编写从中读取的文件。我可以把那个特殊的文件放在我的源代码管理之外。(我总是担心!)

我首先跟踪显示使用名为anything.env文件的文档。我创建了一个名为hush-hush.env的文件,在其中我指定了变量。这是文件的完整内容:

db_pw=大秘密

然后在Docker Compose中,在服务中,env_文件标记允许您指向它。甚至可以删除YML文件中的环境标记。

dataapidocker:
图片:$Docker_Registry-DataApidocker
建造:
语境:
dockerfile:dataapidocker/dockerfile
文件:
- HuSH HuS.Env

这很管用。我的应用程序能够在代码中发现环境变量。

但后来我改进了我的解决方案,为我的数据库使用另一个容器。主容器依赖于新的MSSQL容器。而MSSQL容器要求我将数据库密码作为一个环境变量传递。因为db_pw已经存在,通过替换(通过花括号),我可以很容易地做到这一点。这是新的Docker撰写文件:

版本:“3.4”
服务:
dataapidocker:
图片:$Docker_Registry-DataApidocker
建造:
语境:
dockerfile:dataapidocker/dockerfile
文件:
- HuSH HuS.Env
依赖性:
-DB
分贝:
图片:mcr.microsoft.com/mssql/server
卷:
-mssql服务器julie data:/var/opt/mssql/data
环境:
sa_密码:“$db_pw”
接受“Y”
端口:
-“小精灵”
卷:
MSSQL服务器Julie数据:

这里有一个操作顺序问题。当我构建Docker撰写文件时,它抱怨DB U PW不可用,我的应用程序出现故障。DB服务未获取my hush-hush.env文件的内容。我尝试了很多事情,例如,将env_文件添加到db服务。最后,这就是我学到的。

替换使用要求在Docker Compose中定义db_pw变量。我把它重新添加到主要服务中,但它并没有从hush-hush.env得到价值。

但是你可以有一个没有名字的.env文件。扩展名*是文件的全名。docker compose将足够早地读取它,并将.env文件中的值提供给声明的db_pw。然后所有的碎片都落在了原位。将mssql容器的db_pw值作为其环境变量进行拆分。我的应用程序代码能够读取docker为自己的任务传递到运行容器中的环境变量。

最后一个docker-compose.yml文件如下:

版本:“3.4”
服务:
dataapidocker:
图片:$Docker_Registry-DataApidocker
建造:
语境:
dockerfile:dataapidocker/dockerfile
环境:
-DPY-PW
依赖性:
-DB
分贝:
图片:mcr.microsoft.com/mssql/server
卷:
-mssql服务器julie data:/var/opt/mssql/data
环境:
sa_密码:“$db_pw”
接受“Y”
端口:
-“小精灵”
卷:
MSSQL服务器Julie数据:

它依赖一个名为“.env”的文件定义了变量键值对(与上面的hush-hush.env相同)。

db_pw=大秘密

资源:
https://docs.docker.com/compose/environment-variables网站/

宣布:深入研究英孚核心2天研讨会

6月17-18日在伦敦与我一起深入探讨实体框架核心,为期两天。yabo官网

这是技能问题课程目录的新添加。因为这是一门新课程,我们希望获得关于拟涵盖主题列表的反馈。如果你有兴趣参加,您的输入将有所帮助。

主题列表在2天内是否太长?它是否涉及到你想在高级课堂上学习的内容?您可以提供关于课程描述页.

第1天:利用高级功能

  • EF核心与EF6差异的高水平回顾
  • 实现日志记录以捕获ef core的数据库和内存中的活动。了解要捕获的不同类型的日志记录数据
  • 学习各种播种方法,例如通过数据库脚本,代码或使用ef core 2.1中引入的基于迁移的播种。您还将了解每种方法何时适用。
  • 在开发、源代码管理和部署期间使用迁移
  • 集成测试您的EF核心代码

第2天:软件架构中的EF核心

  • 关于存储库的大辩论:用于公开EF核心的存储库模式/通用存储库的利弊
  • 设计数据层/API
  • 了解复杂的映射约定,并使用Fluent API使用自定义映射对其进行补充。
  • 性能设计
  • *奖金主题*如果涵盖了所有模块,您还将在Azure函数中查看ef core,并在Azure Cosmos DB中查看ef core(给定足够的时间)

使用MongoDB C API的一些编码模式

在2019年2月的《msdn杂志》上(使用其用于MongoDB的API探索Azure Cosmos DB的多模型功能)“我的数据点”专栏探讨了使用Azure Cosmos DB的MongoDB模型MongocSharpDriver.我首先处理MongoDB的本地实例,然后处理Azure实例。但是柱子有点长,所以我剪了一些多余的部分。所以我把它们放在这里,并从文章链接到这个博客文章。

在本文中,我使用imongocollection对象查询数据并将其存储到数据库中。必须为要序列化和反序列化的集合对象指定类型。在这篇文章中,我把收藏打给我的班级,例如,收藏 .也可以将集合一般地键入bsondocument。这里有一些关于这个的信息和一些代码。

将集合键入bsondocument

映射的另一个路径是使用不依赖于特定类型的bsondocument类型的集合对象。这将允许您拥有更多的通用方法。但这也意味着手动序列化和反序列化对象,这很容易使用TobsonDocument进行序列化:

var coll=db.getcollection(变量coll=db.getcollection)
         
          (“船舶”);coll.insertone(ship.tobsondocument());
         

鉴于这些文件有鉴别器,然后,您可以在查询中指定一个类型来检索特定类型,尽管,默认情况下,层次结构无法解释。本文引用了有关C_API多态性的文档。以下是链接.检查了解如何更详细地正确实现多态性。以下代码将仅在与配置的识别器匹配的情况下收回文档,这些识别器用于船载和退役船载到DSHIPS:

var coll=db.getcollection(变量coll=db.getcollection)
         
          (“船舶”);var ships=coll.asqueryable().oftype
          
           ()var dships=coll.asqueryable().oftype
           
            ()
           
          
         

封装MongoClient,数据库和集合

重复指定类型化集合实例,正如我在文章demos中所做的,会成为拖累。你可以提前安排他们,例如,在充当与数据库交互的上下文的类中,如图所示:

public class expansecontext public imongodatabase expansedb get;私人集合;}公共imongocollection
         
          船舶{;私人集合;}公共imongocollection
          
           字符get;private set;public expansecontext()expansedb=new mongoclient().getdatabase(“expansedatabase”);船舶=expansedb.getCollection
           
            (“船舶”);字符=expansedb.getCollection
            
             (以下简称“船舶”);
            
           
          
         

用于插入文档的重构代码可读性更高:

private static void insertviacontext()var context=new expansecontext();var ship=新船name=“Agatha King”};context.ships.insertone(船舶);}

在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代码

所以首先要做的是:你需要安装天青函数蓝天账户对vs代码的扩展,Azure函数扩展依赖于Azure函数核心工具。扩展安装说明将帮助您获得所需的所有信息,扩展会检查更新并提示您根据需要更新这些工具。事实上,我昨晚收到这个提示。2019年1月16日\u 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 U 18-11-39副本.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脚本时使用所有这些using语句。2019年1月19日\u 15-16-45.png

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

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

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

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

主机启动

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

http://localhost:7071/api/httptriggercsharp?名字=朱莉

以及浏览器输出

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

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

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

为了使用与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方法同步,并创建一个输出参数。像触发器绑定参数一样,我需要向输出参数添加一个属性来指定绑定。我还提供数据库和集合名称的参数,具有到数据库帐户的连接字符串的设置的名称,以及最后一个确保在需要时创建数据库和集合的设置。
[函数名(“httpTriggerCSharp”)]public static 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或tools cli命令:
主机启动
使用cli命令时,我在测试中发现我使用的版本似乎需要我运行 清洁网首先是成功。ctrl-f5为您完成这一步。我在现有的Github发行版中注意到了这一点。你可以读到 在这里.
官方文件中有很多有用的信息。我靠的两个是: