7

我正在为我正在从事的项目寻找 SignalR,它似乎正是我想要的。然而,我仍然有点困惑的是团体和加入。

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

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

现在我从文档中看到有一个 Join and Disconnect 方法,您可以使用它来将某人加入一个组,但是似乎 Join 除了查询字符串之外没有与之关联的上下文,所以我有点困惑至于触发联接的原因,正如我所期望的那样,它将是客户端上的手动触发方法,传递一些对象,提供有关将它们放入哪个房间的上下文,因为您可能有数百个私人房间。

那么如何为 Join 方法提供一些上下文和断开连接,以便他们知道您请求加入哪个房间,就好像它不是手动触发的一样,您如何设置查询字符串,如果是手动触发,为什么可以您不会发送自定义对象。IE

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

对比

public Task Join(string groupName)
{
    return Groups.Add(Context.ConnectionId, groupName);
}

那么我是否遗漏了什么,或者有什么方法可以为加入的用户提供上下文,以便第一次将他们放在正确的位置?

4

1 回答 1

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[]>对于我的组名,我使用 Singleton 生成并使用 a (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;
}

希望它至少有点帮助!

于 2012-08-22T18:31:17.903 回答