在SignalR中向除self以外的所有客户端广播消息

Ica*_*rus 22 c# asp.net-mvc-4 .net-4.5 signalr

我意识到这些问题是相似的:

SignalR - 向除Caller之外的所有客户端广播

向当前客户端以外的组中的所有客户端发送消息

然而,他们已经老了,目前的文件中没有任何内容给我任何关于我是否做正确的事情的线索.

这是问题/问题:

我需要能够从服务器端向所有连接的客户端广播消息,除了提交http请求的人 - 想象有人提交表单并让所有连接到同一表单的人被通知已提交的内容.

我现在这样做的方式是这样的:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
var connectionID = HttpContext.Request.Cookies["conn-id"].Value;
context.Clients.AllExcept(connectionID).addMessage(message);
Run Code Online (Sandbox Code Playgroud)

每次建立连接时,我都会在客户端的cookie中设置ConnectionID,如下所示:

$.connection.hub.start().done(function(){ 
      $.cookie("conn-id",$.connection.hub.id); 
});
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 这是我在这种情况下可以采取的最佳/唯一方法吗?我可以从其他地方读取发起请求的客户端的连接ID,hub.Context.ConnectionID或类似于SessionID从HttpContext.Current.Session.SessionID 获取的方式吗?

  2. 例如,可以通过将客户端连接到SessionID来以编程方式设置连接ID吗?这可能由于某种原因导致问题吗?如果是这样,您能否解释一下如何以编程方式设置连接ID以及我需要连接到哪个事件才能执行此操作?

我注意到每次重新加载页面时,连接ID都会更改为不同的guid.如何仅将ConnectionId设置一次并至少在Session的生命周期内维护它?

N. *_*len 29

您的方法确实有效,但正确的方法是使用内置的API : Clients.Others.addMessage(message). 此外,无需在集线器内部获取集线器上下文.您始终可以通过Context.ConnectionId访问当前连接ID,或通过Clients.All.foo()发送消息sto客户端;

并且您无法以编程方式设置ConnectinoID.如果您想跨页面跟踪用户,请维护服务器上的用户列表,然后在他们浏览网站时重新分配连接ID.

这是一篇解释用户跟踪的帖子:SignalR 1.0 beta连接工厂