26

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

SignalR - 向除呼叫者以外的所有客户端广播

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

但是,它们很旧,当前文档中的任何内容都没有给我任何关于我是否在做正确的事情的线索。

这是问题/问题:

我需要能够从服务器端向所有连接的客户端广播一条消息,除了提交 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); 
});

所以我的问题是:

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

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

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

4

2 回答 2

33

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

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

这是一篇解释用户跟踪的帖子:SignalR 1.0 beta connection factory

于 2013-06-21T19:38:31.483 回答
3

如果您在 Hub 类的方法中发送消息,您还可以使用 Clients.Others 排除调用客户端。如果您不在集线器方法中,则只需要使用 AllExcept(id) 。

有关详细信息,请参阅以下内容:

http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server#selectingclients

于 2013-06-21T19:38:21.933 回答