c# - 使用 SignalR 输出绑定(bind)的 CosmosDB Azure 函数触发器

标签 c# azure azure-functions signalr azure-cosmosdb

我正在尝试使用 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/

相关文章:

c# - 在asp.net中发送带有多个查询字符串作为查询字符串参数的url

mysql - Azure Database for MySQL - 单一服务器的备份状态警报

azure - .NET Core 关键字不支持 : 'server'

azure - 在哪里存储 local.settings.json 中的设置以进行 proddeployment?

门户中的 Azure 功能、查看文件和集成设置不同步

c# - 如何使用 Roslyn 读取 XML 文档注释

c# - Visual Studio 2013 缩进在编写时不起作用

c# - 当我使用 Convert 格式化日期时,WPF DataBinding 非常慢

azure - 如何在Azure SQL中隐藏数据库?

visual-studio - 在本地运行 Azure Functions