2012-05-18 40 views
7

我在看SignalR一个项目我的工作,这似乎是我想要的东西。然而,我仍然有点困惑的是团队和加入。SignalR和加入群

我会尝试首先描述的执行环境。因此,现有系统中的用户想要召开关于给定主题的会议,然后创建具有给定名称/标识符的会议室,然后他们将邀请其他会员进入会议室,然后基本上像私人聊天室一样。

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

现在我从文档中看到有一个Join和Disconnect方法,您可以将某人放入组中,但似乎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); 
} 

所以我思念的东西或者是有一些方法给上下文的连接用户可以把他们在正确的地方第一次?

回答

8

我和你有过很多相同的经历,并且有过与我一样的工作/战斗,所以我会分享我所做的。

你需要的地方捕捉的状态。查看从客户端到服务器的往返传输下的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); 
} 

对于我的组名称,我使用单例生成并使用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; 
} 

希望它至少依稀有用!

+0

感谢所有有用的东西,我不会把它当作现在的答案,但会给你一个有用的投票。希望随着时间的推移,更多的人会钟情于此。 – Grofit

+0

是的,这是新东西,因为我们知道我们会改进 – testpattern

+0

+1。我认为这是唯一的方法,因为SignalR不提供返回给定连接ID的组名的API。 – GETah