SignalR和加入组

Gro*_*fit 7 .net asp.net signalr

我正在看SignalR正在进行的项目,它似乎完全是我想要的.然而,我仍然有点困惑的一点是团体和加入.

我将首先尝试描述实现的上下文.因此,现有系统中的用户将希望召开关于给定主题的会议,然后创建具有给定名称/标识符的房间,然后他们将邀请其他人进入该房间,然后它将基本上像私人聊天室.

所以我假设的步骤是作为主机,创建一个房间并加入它,然后发出邀请,这将要求用户点击哪个会以某种方式告诉服务器加入哪个房间.

现在我从文档中看到有一个Join和Disconnect方法可以挂钩将某人放入一个组,但是看起来Join除了查询字符串之外没有与之关联的上下文,所以我有点困惑至于什么触发了Join,正如我所期望的那样,它将是客户端上的一个手动触发的方法,通过一些对象提供关于放入它们的空间的上下文,因为你可以拥有数百个私人房间.

那么如何为Join方法提供一些上下文和断开连接,让他们知道您要求加入的空间,就好像它不是手动触发的,如何设置查询字符串,如果是手动触发,为什么可以你不发送自定义对象.即

public Task Join()
{
    var groupName = Context.QueryString["some-room-identifier"];
    return Groups.Add(Context.ConnectionId, groupName);
}
Run Code Online (Sandbox Code Playgroud)

VS

public Task Join(string groupName)
{
    return Groups.Add(Context.ConnectionId, groupName);
}
Run Code Online (Sandbox Code Playgroud)

所以我错过了一些东西,或者是否有某种方法可以为加入的用户提供上下文,以便将它们放在正确的位置?

tes*_*ern 8

我和你有着相同的经历,并且经历过一段时间的努力/战斗,所以我将分享我所做的一切.

你需要在某个地方捕获一个州.查看从客户端到服务器的Roundtripping 下的SignalR Hubs wiki https://github.com/SignalR/SignalR/wiki/Hubs.我发现它非常有用,因为它告诉您如何在服务器中心或客户端上设置状态并在另一端检索它.

我得出了与你相同的结论,即一些事件手动触发了Join.我正在使用投票查看是否有人请求与用户聊天.您实际上可以从服务器推送(请参阅SignalR Join Group From Controller),这意味着处理添加新聊天消息的控制器操作可以调用集线器的Join方法:

// join chatroom
public Task Join(dynamic mygroup)
{
var groupName = groupy.GetGroupName(parent.userId, (int)mygroup.userIdTo);
return Groups.Add(Context.ConnectionId, groupName);
}
Run Code Online (Sandbox Code Playgroud)

对于我的组名,我使用Singleton来生成并使用a Dictionary<string, int[]>(int[]用于userIds)跟踪名称.

对于客户端状态的东西,我最终制作了一个管理组名的自定义JavaScript对象,就像这样......

Chat.Chatgroup = function (groupId, userIdTo) {
this.GroupId = groupId; // our group's title / id
this.UserIdTo = userIdTo; // who the other user is
}
Run Code Online (Sandbox Code Playgroud)

然后我在连接后调用signalR方法

onechat.getOurGroup(mygroup) // invoke method on server
.done(function (response) {
mygroup = response;
 /* + whatever else you need to do*/ });
Run Code Online (Sandbox Code Playgroud)

现在,您可以在服务器上设置状态并在客户端上保持该状态:

public dynamic GetOurGroup(dynamic mygroup)
{
var ourId = groupy.GetGroupName(parent.userId, (int)mygroup.UserIdTo);
mygroup.GroupId = ourId;                    
return mygroup;
}
Run Code Online (Sandbox Code Playgroud)

希望它至少含糊不清!

  • 但如果用户可以加入多个组,这也不是一个好的解决方案。 (2认同)