繁体   English   中英

CosmosDB Azure function 触发器与 SignalR output 绑定

[英]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它将CosmosDBTriggerSignalR 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM