我正在为SignalR寻找我正在进行的项目,它似乎完全是我想要的。然而,我仍然有点困惑的一点是团体和加入。
我将首先尝试描述实现的上下文。因此,现有系统中的用户将希望召开关于给定主题的会议,然后创建具有给定名称/标识符的房间,然后他们将邀请其他人进入该房间,然后它将基本上像私人聊天室。 / p>
所以我假设的步骤是作为主机,创建一个房间并加入它,然后发出邀请,要求用户点击哪个会以某种方式告诉服务器加入哪个房间。
现在我从文档中看到有一个Join和Disconnect方法可以挂钩将某人放入一个组,但是看起来Join除了查询字符串之外没有与之关联的上下文,所以我是关于触发Join的内容有点困惑,因为我预计它将是客户端上的手动触发方法,通过一些对象提供关于放入它们的空间的上下文,因为您可能有数百个私人房间。
那么如何为Join方法提供一些上下文和断开连接的方法,以便他们知道您要求加入的空间,就好像它不是手动触发的,如何设置查询字符串,以及是否是手动触发了为什么你不能发送自定义对象。即
public Task Join()
{
var groupName = Context.QueryString["some-room-identifier"];
return Groups.Add(Context.ConnectionId, groupName);
}
VS
public Task Join(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
我是否遗漏了某些内容,或者是否有某种方法可以为加入的用户提供上下文,让他们第一次将它们放在正确的位置?
答案 0 :(得分:8)
我和你有着相同的经历,并且经历过一段时间的努力/战斗,所以我将分享我所做的一切。
你需要在某个地方捕捉一个州。查看从客户端到服务器的Roundtripping下的SignalR Hubs wiki https://github.com/SignalR/SignalR/wiki/Hubs。我发现这很有用,因为它告诉你如何在服务器中心或客户端上设置状态并在另一端检索它。
我得出了与您相同的结论,即某些事件会手动触发加入。 我正在使用民意调查来查看是否有人请求与用户聊天。您实际上可以从服务器推送(请参阅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);
}
对于我的群组名称,我使用Singleton来生成并使用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
}
然后我在连接后调用signalR方法
onechat.getOurGroup(mygroup) // invoke method on server
.done(function (response) {
mygroup = response;
/* + whatever else you need to do*/ });
现在,您可以在服务器上设置状态并在客户端上保持该状态:
public dynamic GetOurGroup(dynamic mygroup)
{
var ourId = groupy.GetGroupName(parent.userId, (int)mygroup.UserIdTo);
mygroup.GroupId = ourId;
return mygroup;
}
希望它至少含糊不清!