[英]CosmosDB Azure function Trigger with SignalR output binding
我正在尝试使用 Cosmos 触发器(在 c# 中)创建一个 Azure function 来监视对 CosmosDB 的更改,这看起来相对简单,我成功地做到了这一点,我有一个 Azure function 将对数据库的更改记录到日志控制台。 我正在尝试编写一个 output 绑定以将更改发送到 Azure SignalR 但是当我尝试这个时,我遇到了孤立的进程不支持执行此操作所需的程序集。 有没有人有一个 c# Azure Cosmos 触发器 function 的非常简单的示例,它将检测到的更改发送到 Cosmos DB 到 Azure SignalR 服务,这样我就可以订阅这个并将这些报告给客户端应用程序。 任何帮助将不胜感激。
我在 web 上找到的我想做的代码(这只是一个测试函数)如下:
[Function("CosmosTriggerSigR")]
public void Run([CosmosDBTrigger(
databaseName: "test",
collectionName: "testCollection",
ConnectionStringSetting = "cosmos_DOCUMENTDB",
LeaseCollectionName = "leases")]
IReadOnlyList<MyDocument> input,
[SignalR(HubName = "events", ConnectionStringSetting = "SignalRConnectionString")]
IAsyncCollector<SignalRMessage> signalRMessages,
ILogger log)
{
if (input != null && input.Count > 0)
{
_logger.LogInformation("Documents modified: " + input.Count);
_logger.LogInformation("First document Id: " + input[0].Id);
}
}
并且在尝试部署它时,它显示此错误:
C:\Users\CosmosSigr1204\CosmosTriggerSigR.cs(29,14):错误 AZFW0001:属性“SignalRAttribute”是 WebJobs 属性,在 .NET Worker(独立进程)中不受支持。 [C:\Users\CosmosSigr1204\CosmosSigr1204.csproj] 终端进程 "C:\Program Files\do.net\do.net.exe 'publish', '--configuration', 'Release', '/property:GenerateFullPaths =true', '/consoleloggerparameters:NoSummary'" 以退出代码终止:1。
我对 Azure SignalR 几乎一无所知,如果上面的代码不是我想要做的事情,那么我很抱歉。
这是使用您指定的服务组合的完整解决方案: https://github.com/ealsur/serverlessazurefriday
特别是这个 Function: https://github.com/ealsur/serverlessazurefriday/blob/master/src/DistributedDashboard/NotificationsTrigger.cs它将CosmosDBTrigger
和SignalR
output 联系起来,像这样:
[FunctionName("Notifications")]
public static async Task Run(
[CosmosDBTrigger(
databaseName: "eventsDb",
collectionName: "events",
LeaseCollectionPrefix = "Notifications",
ConnectionStringSetting = "CosmosDBAzureFriday",
PreferredLocations = "%REGION%",
LeaseCollectionName = "leases")]
IReadOnlyList<Document> events,
[SignalR(HubName = "events", ConnectionStringSetting = "SignalRAzureFriday")]
IAsyncCollector<SignalRMessage> signalRMessages,
ILogger log)
{
await signalRMessages.AddAsync(new SignalRMessage()
{
Target = "console",
Arguments = new[] {
events.Select(singleEvent => JsonConvert.DeserializeObject<ConsoleLog>(singleEvent.ToString()))
}
});
}
在这种情况下,代码将发送 1 SignalR 消息,其中包含在触发器上收到的所有文档,您可以选择为每个触发器文档发送 1 SignalR 消息,这取决于您的应用程序设计。
对于此解决方案,客户端应用程序(浏览器)使用 JS 库连接到 SignalR 集线器,并接收包含所有 Cosmos DB 文档并使用数组的 SignalR 消息(参考https://github.com/ealsur/ serverlessazurefriday/blob/master/src/ClientApp/scripts/site.js ):
// Assuming connection is a SignalR connection created by SignalR library
// https://learn.microsoft.com/aspnet/core/signalr/javascript-client?#connect-to-a-hub
connection.on('console', function(messages){
angular.forEach(messages, function(message){
term.writeln('>> Device '+message.deviceId +' in ' + message.region + ' reports value of ' + message.value);
});
});
其中console
只是与 SignalR output 消息中的Target
匹配的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.