我正在尝试使用 Cosmos 触发器(在 C# 中)创建一个 Azure 函数来监视对 CosmosDB 的更改,这看起来相对简单,并且我已经成功地做到了这一点,没有遇到任何麻烦,我有一个 Azure 函数将更改记录到DB 到日志控制台。我正在尝试编写一个输出绑定(bind)以将更改发送到 Azure SignalR,但是当我尝试此操作时,我遇到了隔离进程不支持执行此操作所需的程序集。有谁有一个非常简单的 c# Azure Cosmos 触发器函数示例,该函数将检测到的 Cosmos DB 更改发送到 Azure SignalR 服务,以便我可以订阅此示例并将这些更改报告给客户端应用程序。任何帮助将不胜感激。
我在网上找到的我想要做的代码(这只是一个测试功能)如下:
[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\dotnet\dotnet.exe 'publish', '--configuration', 'Release', '/property:GenerateFullPaths=true', '/consoleloggerparameters:NoSummary'” 终止并退出代码: 1.
我对 Azure SignalR 几乎一无所知,并且我正在尝试蒙混过关,如果上面的代码不是我想要做的事情,我深表歉意。
最佳答案
以下是使用您指定的服务组合的完整解决方案:https://github.com/ealsur/serverlessazurefriday
特别是这个函数:https://github.com/ealsur/serverlessazurefriday/blob/master/src/DistributedDashboard/NotificationsTrigger.cs它将 CosmosDBTrigger 和 SignalR 输出联系起来,如下所示:
[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 输出消息上的 Target
匹配的名称。
关于c# - 使用 SignalR 输出绑定(bind)的 CosmosDB Azure 函数触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71854066/