【发布时间】: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,因此为方便起见,只需按照解决方案进行操作即可。
标签: c# azure visual-studio-code azure-functions