我意识到这些问题是相似的:
SignalR - Broadcast to all clients except Caller
Send a message to all clients in a Group, except for the current client
然而,他们已经老了,目前的文件中没有任何内容给我任何关于我是否做正确的事情的线索。
这是问题/问题:
我需要能够从服务器端向除了提交http请求的人之外的所有连接的客户端广播消息 - 想象某人提交表单并让所有连接到同一表单的人被通知某事已经提交。
我现在这样做的方式是这样的:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var connectionID = HttpContext.Request.Cookies["conn-id"].Value;
context.Clients.AllExcept(connectionID).addMessage(message);
每次建立连接时,我都会在客户端的cookie中设置ConnectionID,如下所示:
$.connection.hub.start().done(function(){
$.cookie("conn-id",$.connection.hub.id);
});
所以我的问题是:
这是我在这种情况下可以采取的最佳/唯一方法吗?我是否可以从其他地方(例如hub.Context.ConnectionID
)读取发起请求的客户端的连接ID,或类似于从HttpContext.Current.Session.SessionID获取SessionID
的方式?
例如,我可以通过将客户端连接到SessionID来以编程方式设置连接ID吗?这可能由于某种原因导致问题吗?如果是这样,您能否解释一下如何以编程方式设置连接ID以及我需要连接到哪个事件才能执行此操作?
我注意到每次重新加载页面时,连接ID都会更改为不同的guid。如何仅将ConnectionId设置一次并至少在Session的生命周期内维护它?
答案 0 :(得分:26)
您的方法确实有效,但正确的方法是使用内置API:Clients.Others.addMessage(message)
。此外,无需在集线器内部获取集线器上下文。您始终可以通过Context.ConnectionId访问当前连接ID,或通过Clients.All.foo();
并且您无法以编程方式设置ConnectinoID。如果您希望跨页面跟踪用户,请维护服务器上的用户列表,然后在他们浏览网站时重新分配连接ID。
以下是解释用户跟踪的帖子:SignalR 1.0 beta connection factory
答案 1 :(得分:1)
如果您在Hub类的方法中发送消息,您还可以使用Clients.Others排除调用客户端。如果您不在集线器方法中,则只需要使用AllExcept(id)。
有关详细信息,请参阅以下内容:
http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server#selectingclients