如何使用 SignalR 加入群组

Posted

技术标签:

【中文标题】如何使用 SignalR 加入群组【英文标题】:How to join a group using SignalR 【发布时间】:2013-06-22 23:35:07 【问题描述】:

我是使用 SignalR 的新手(从今天开始),向所有连接的客户端发送消息非常简单,但现在我只想发送给一个组。我找不到有关如何在客户端加入的简单文档。如果有人可以提供帮助,我怎么能简单地加入 javascript 方面的组。感谢您的帮助。

public class EventHub : Hub

    public void SendNewMedia(MediaInfoViewModel model,Guid eventId)
    
        Clients.Group(eventId.ToString()).setupmedia(model);
    

//Controller that is sending client new data
var eventHub = GlobalHost.ConnectionManager.GetHubContext<EventHub>();
              var result = eventHub.Clients.Group(eventId.ToString()).setupmedia(eventViewer);

//Finally the javascript. Not sure how to setup just for a group
$(function () 
    var event = $.connection.eventHub;
    event.client.setupmedia = function (newMedia) 

        $('#photolist').prepend('<li><img src="' + newMedia.MediaUrl + '" class="img-polaroid span2"/></li>');
    ;
    $.connection.hub.start(function() 
        event.server.create(eventID);//I know this is wrong but not sure how to connect
    ).done(function () 
        alert('conntected. Ready to retrieve data!');
    );
);

【问题讨论】:

【参考方案1】:

你不能。如果您可以从 javascript 加入一个组,那么任何人都可以使用您的代码加入任何破坏安全性的组。如果您确实需要这样做 - 在服务器端创建一个方法,该方法将组名作为参数并将客户端添加到组中。

public void JoinGroup(string groupName)

    this.Groups.Add(this.Context.ConnectionId, groupName);

然后,像这样从 JS 调用它

eventHub.server.joinGroup("my-awsm-group");

【讨论】:

有点惊讶这是唯一的答案。作为 Signal R 的新手,我很好奇自己加入小组的替代模式是什么?有没有办法在服务器端加入客户端,例如不属于像这样的直接显式交互的一部分(JS客户端调用方法)。就像您可以将客户端加入服务器端的组,如果您拥有他们的客户端 ID,然后他们神奇地成为其中的一部分? PS。这真的不是一个不同的问题 - 如果您(或其他任何人)有任何其他想法,则更多相同 组管理只在服务器上完成,所以是的 - 如果你有用户的连接 ID,你可以将他添加到任何组。事实上,这就是它应该工作的方式。 如何使用纯 JS(无 Angular 或 Jquery 插件)在客户端获取 eventHub?我正在使用 Microsoft (v4.2.2) 的最新 signalr.js,我可以创建和使用连接和订阅,但我不知道如何调用集线器中公开的方法。 【参考方案2】:

--------------在Javascript(ReactJs)中-- ----------------

const connection = new signalR.HubConnectionBuilder()
  .withUrl("connectionUrl")
  .build();
connection.start().then(res => 
    connection.invoke("JoinGroup", "groupName")  //JoinGroup is C# method name
        .catch(err => 
            console.log(err);
        );
).catch(err => 
            console.log(err);
        );;

----------------在 C# (.Net Core) 中-----------------

public class NotificationHub : Hub
    
        public Task JoinGroup(string groupName)
        
                return Groups.AddToGroupAsync(Context.ConnectionId, groupName);
        
     

【讨论】:

与此有关的问题,如所写 (1) Task 中的异步在哪里 (2) 你在返回什么,你将 Task 定义为 void。【参考方案3】:

以防万一您现在遇到这个问题(就像我一样),这里有一个示例,说明如何实现一个 azure 函数来支持组。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-signalr-service#2x-c-group-management-output-examples

【讨论】:

以上是关于如何使用 SignalR 加入群组的主要内容,如果未能解决你的问题,请参考以下文章

如何创建唯一代码以邀请新用户加入移动应用程序中的群组

使用 SignalR,是不是可以将消息批量推送到不断变化的客户端集合?

如何将消息从另一个用户的频道正确转发到群组?

融云 SDK 如何实现群组操作

SignalR:同步组加入

linux中如何用指令将用户加入到群组中