如何在 Visual Studio 代码中创建和部署函数应用程序?

Posted

技术标签:

【中文标题】如何在 Visual Studio 代码中创建和部署函数应用程序?【英文标题】:How to create and deploy function app in visual studio code? 【发布时间】:2019-06-05 03:39:33 【问题描述】:

要求 创建一个 Azure 函数,监控所有传入 IoT 中心的消息,并在对消息进行一些修改后将其发送给 Cosmos 数据库

架构

问题:无法创建将传入消息读取到 IoT 中心并发送到 Cosmos DB 的 Azure 函数

遵循的步骤

我已按照以下步骤使用Visual Studio Code 创建和部署Azure Function App

打开 Visual Studio 代码

转到Azure Extension Panel

选择C#语言

它创建了以下文件

.vscode .gitignore FunctionApps.csproj host.json localsettings.json

现在我点击了Visual Studio Code 中的“创建函数”按钮并选择了CosmosDBTrigger 并映射了已在Azure 门户中创建的CosmoDB。在c#类下面生成

namespace Company.Function

 public static class CosmosDBTriggerCSharp
 
 [FunctionName("CosmosDBTriggerCSharp")]
 public static void Run([CosmosDBTrigger(
    databaseName: "databaseName",
    collectionName: "collectionName",
    ConnectionStringSetting = "dev-test-cosmo-db_DOCUMENTDB",
    LeaseCollectionName = "leases")]IReadOnlyList<Document> input, ILogger log)
    
    if (input != null && input.Count > 0)
    
        log.LogInformation("Documents modified " + input.Count);
        log.LogInformation("First document Id " + input[0].Id);
    
   
  

现在,我通过键入“部署到函数应用程序”并运行 Azure Functions: 部署到函数应用程序命令执行 (Ctrl+Shift+P) 来部署函数强>。

我在 Visual Studio Code Terminal 中看到 Success 消息

  3:09:06 PM liveConnectMessageEnhancefunapp: Creating zip package...
  3:09:07 PM liveConnectMessageEnhancefunapp: Starting deployment...
  3:09:18 PM liveConnectMessageEnhancefunapp: Updating submodules.
  3:09:19 PM liveConnectMessageEnhancefunapp: Preparing deployment for commit id 'f58cf57151'.
  3:09:21 PM liveConnectMessageEnhancefunapp: Skipping build. Project type: Run-From-Zip
  3:09:21 PM liveConnectMessageEnhancefunapp: Skipping post build. Project type: Run-From-Zip
  3:09:24 PM messageEnhancefunapp: Syncing 0 function triggers with payload size 2 bytes successful.
  3:09:25 PM messageEnhancefunapp: Updating D:\home\data\SitePackages\packagename.txt with deployment 20190110093910.zip
  3:09:25 PM messageEnhancefunapp: Deployment successful.
  Deployment to "messageEnhancefunapp" completed.

警告

C:\Users\deeku.nuget\packages\microsoft.net.sdk.functions\1.0.24\build\netstandard1.0\Microsoft.NET.Sdk.Functions.Build.targets(41,5):警告:函数 [CosmosDBTriggerCSharp]:local.settings.json 中 AzureWebJobsStorage 的缺失值。这对于除 HTTP 之外的所有触发器都是必需的。 [C:\FunctionApps\FunctionApps.csproj] C:\Users\deeku.nuget\packages\microsoft.net.sdk.functions\1.0.24\build\netstandard1.0\Microsoft.NET.Sdk.Functions.Build.targets(41,5):警告:[C :\FunctionApps\FunctionApps.csproj]

但是当我导航到Azure Portal 时,我看到以下消息

您的应用当前处于只读模式,因为您正在从包文件运行。从包运行时,文件系统是只读的,不能对文件进行更改。要进行任何更改,请更新 zip 文件中的内容和 WEBSITE_RUN_FROM_PACKAGE 应用设置。

【问题讨论】:

第一个警告是提醒您AzureWebJobsStorage 在本地调试中是必需的。第二条消息是告诉您不能修改门户网站上的预编译项目。如果您专注于在 Azure 站点上运行,这些都是无害的,您看到了什么错误,例如cosmosdb 触发器无法按预期工作? Unable to create a Azure function which reads the incoming messages to IoT Hub and sends to Cosmos DB,要实现这一点,您需要创建一个 IoT 中心(事件中心)触发器而不是 cosmosdb。 我有 IoT Hub 并且正在接收消息,但我需要在将消息存储到 CosmosDB 之前更新消息。所以我打算在 IotHub 和 CosmosDb 之间使用 Azure 函数。我不想直接在门户中编写 azure 函数,因为我想在 TFS 中跟踪此函数的更改。所以我正在使用Visual Studio代码来编写函数 啊,看来我蹩脚的英语让你很困惑。 Those are both harmless if you focus on the running on Azure site 并不是说​​在门户中编写代码。警告和消息并不代表 Azure 上的预编译项目有问题。这就是为什么我问你是否看到任何明确的错误。要在部署前验证代码是否有效,请在 local.settings.json 中添加 AzureWebJobsStorage 并调试。而对于触发器类型,CosmosDB 触发器只有在我们向某个 CosmosDB 发送数据时才起作用,也许您需要重新考虑模式? 我选择了错误的模板“CosmosDBTrigger”。我应该搜索“IoT Hub 触发器”,但正如@Tamás Huj 所述,它不可用。 IoT 中心触发器实际上是一个事件中心触发器。由于您可以使用 Visual Studio,因此为方便起见,只需按照解决方案进行操作即可。 【参考方案1】:

在您的示例中,您正在创建一个 CosmosDBTrigger,如果您想捕获 cosmos DB 中的更改,可以使用它。但是,根据您的描述,您希望捕获 IoT Hub 中的更改。

我没有在 Visual Studio Code 中找到 IoT Hub 触发器,但如果您使用的是完整版 Visual Studio,您可以在此处找到 IoT Hub 触发器:

您只需要在此屏幕上设置连接,在此方法中您将收到来自 IoT Hub 的消息,您可以根据需要对其进行修改,并将其保存到 Cosmos DB。

这是一篇关于同一主题的类似博客文章: https://medium.com/@avirup171/azure-iot-hub-azure-function-azure-cosmos-db-walkthrough-cc30d12d1055

【讨论】:

我看过这篇博文,它确实在做需要做的事情,但我正在寻找的小改动是从 Visual Studio 代码中推送function code,以便我可以在 TFS 中跟踪它并自动化我的构建管道.让我试试 asnwer 中提到的“IoT Hub Trigger”,并随时通知您。顺便问一下,您使用的是哪个版本的 Visual Studio?我使用的是 2017 年。 我有相同的版本,现在是 2017 年。而且我认为,即使您是从 VS 部署,您也可以重用博客中的大部分代码。从门户部署和从 VS 部署应该没有太大区别。 我有一些问题。将该功能部署到门户后,它不起作用。如何进行故障排除以及在哪里可以看到连接字符串? 对于故障排除,您可以根据需要编写尽可能多的日志,并从门户或 Visual Studio 中检查它们,在服务器资源管理器中您可以找到您的函数,然后右键单击并附加调试器。跨度> 是的,已解决。连接字符串不会自动部署到门户。我不得不在 azure 功能的“应用程序设置”中手动添加键。

以上是关于如何在 Visual Studio 代码中创建和部署函数应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在visual studio2008中创建,编译和运行C++程序,

如何在 Erlang Mnesia 中创建和使用(或模拟)多列索引

Visual Studio Code 中的 Flutter SDK 路径问题

找不到合适的 Visual Studio 工具链。请运行“颤振医生”以获取更多详细信息

如何调试在 ASP 页中创建的 Visual Studio 6.0 中的 COM 对象?

如何在 Eclipse 中创建区域,如 Visual Studio