创建分组和添加组成员
SignalR分组提供了一种广播信息给指定客户端的方法,一个组里面可以有任意多个成员。同一个客户端可以存在于任意多个不同的组里面。
使用hub类的属性Groups的Add和Remove方法管理组,下面的例子展示客户端代码。
服务器端
public class ContosoChatHub : Hub
{
public Task JoinGroup(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public Task LeaveGroup(string groupName)
{
return Groups.Remove(Context.ConnectionId, groupName);
}
}
js客户端
contosoChatHubProxy.server.joinGroup(groupName);
contosoChatHubProxy.server.leaveGroup(groupName);
不需要创建分组,第一次加入成员组会自动创建,移除最后一个连接成员组自动删除。
SignalR 发送消息给客户端和组基于pub/sub model, 没有获得组列表和组内成员列表的API。服务器不管理组的列表和组内成员的列表,这提高了扩展性, 因为无论何时你添加一个node到一个web form,SignalR可以把连接设置为任何状态。
异步执行Add和Remove方法
Groups.Add和 Groups.Remove 方法是异步的. 如果想要向一个组添加一个客户端,同时立即通过组向用户发送一个消息,那么就必须确保Groups.Add方法执行完毕,下面的代码演示了如何做到:
将一个客户端添加到组
public async Task JoinGroup(string groupName) { await Groups.Add(Context.ConnectionId, groupName); Clients.Group(groupname).addContosoChatMessageToPage(Context.ConnectionId + " added to group"); }
组内成员保持
SignalR 跟踪的是连接,而不是用户, 所以如果想让一个用户每次连接的时候都在同一个组里,那么必须每次连接都调用 Groups.Add 方法。
短暂的连接丢失,SignalR有时可以自动存储连接,这时候使用的是保存的连接而不是新的连接,因为组成员是客户端自动保持的,即使服务器错误或者重启后也可以重连,如果一个服务器停机同时启用新服务器,只要在连接时间内,连接也是可以保持的。
当连接因为连接丢失不能自动存储,或者当连接到期或者断开(例如浏览器跳转页面),组成员丢失。那么下次的连接就是一个新的连接。为了保证同一个用户每次连接记录组信息,建立的app必须自行记录用户分组等信息,然后在连接时加入组。
更多关于连接和重连的信息,参见How to handle connection lifetime events in the Hub class .
单一用户组
使用SignalR的应用必须保持跟踪用户和连接之间的关联,来了解哪个用户发送了消息或者哪个用户应该接收消息。可以使用组来实现这种做法
单一用户组.
可以指定用户名作为组的名字, 同时每次用户连接或者重连的时候添加正确的连接ID给这个组。给这个用户发送消息即给这个组发送消息,这种做法的一个缺点就是组不提供查看用户是否在线的方法。
跟踪记录用户名和connection ID之间的关联.
可以将用户名和他所使用过的connection ID存储起来,如存入数据库,同时每次用户连接或者断开的时候更新存储的数据。这样发送消息给用户就可以指定连接ID,这种做法的缺点是占用更多的内存。