Serverless signalR:将用户添加到组并在上游同时向组发送消息

问题描述 投票:0回答:1

我写了下面的代码,希望将用户添加到组中,同时向该用户所在的组发送消息。我可以在 Azure 门户上看到每个 signalR 刀片建立的连接,但我无法断定用户在返回此函数后是否已成为该组的成员。

    [Function("OnConnected")]
    [SignalROutput(HubName = "myhub")]
    public async Task<object[]> OnConnectedAsync([SignalRTrigger("myhub", "connections", "connected")] SignalRInvocationContext invocationContext)
    {
        var username = "userA";
        var groupName = "groupA";
        return
        [
            new SignalRGroupAction(SignalRGroupActionType.Add)
            {
                GroupName = groupName,
                UserId = username
            },
            new SignalRMessageAction("NewUserConnected")
            {
                GroupName = groupName,
                Arguments = [userName]
            }
        ];
    }

上述函数的实现是否展示了将用户添加到组并同时向组发送消息的正确方法?

注意:在编写此代码之前,我尝试通过以下代码行将用户添加到组,同时具有上面的函数报告

SignalRMessageAction
对象,但它引发了异常:

await UserGroups.AddToGroupAsync(userName, groupName);

显然 signalR 的 SDK 不喜欢上面在上游上下文中的行。

azure-functions signalr signalr-hub azure-signalr
1个回答
0
投票

下面的代码将用户添加到组并向该组发送消息。 Azure Function

SendMessage
旨在处理 POST 请求并使用输出绑定将消息发送到名为“myGroup”的 SignalR 组。

  • 它读取请求正文以提取

    userId
    message

  • 它将

    userId
    添加到 SignalR 组“myGroup”。

  • 它将

    message
    发送到 SignalR 组“myGroup”。

  • Azure Functions SignalR 服务输出绑定参考

将用户添加到组并向该组发送消息:

 [FunctionName("SendMessage")]
    public static async Task<IActionResult> SendMessage(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequest req,
        [SignalR(HubName = "sampathravi90ravi")] IAsyncCollector<SignalRGroupAction> signalRGroupActions,
        [SignalR(HubName = "sampathravi90ravi")] IAsyncCollector<SignalRMessage> signalRMessages,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);

        string userId = data?.userId;
        string message = data?.message;

        if (userId != null && message != null)
        {
            // Add user to group
            await signalRGroupActions.AddAsync(
                new SignalRGroupAction
                {
                    UserId = userId,
                    GroupName = "myGroup",
                    Action = GroupAction.Add
                });

            // Send message to group
            await signalRMessages.AddAsync(
                new SignalRMessage
                {
                    GroupName = "myGroup",
                    Target = "newMessage",
                    Arguments = new[] { message }
                });

            log.LogInformation($"Sent message: {message} to group myGroup for user {userId}");

            return new OkResult();
        }
        else
        {
            log.LogError("Either userId or message not found in the request body.");
            return new BadRequestObjectResult("Please pass userId and message in the request body.");
        }
    }

{

"userId": "userId1",

"message": "Hello, world!"

}

输出: enter image description here enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.