如何知道什么样的客户端连接到信号集线器



我在我的网站上使用signalr。我只有一个从hub继承的类,以及几个带有客户端代码的aspx表单,这些客户端代码具有hub调用的客户端函数。

当客户端连接到集线器时,我将其添加到具有clientID的集合中,当客户端断开连接时,我将其从该集合中删除。只是想知道是否有客户端已连接。只要至少连接了一个客户端,计时器就会调用一些方法来填充服务器上的数据存储库,并将其传播给客户端。

然后我通常在打电话给客户之前这样做:

if (users.Count() > 0)
{
     this.Clients.All.UpdateData(JsonConvert.SerializeObject(someData));
     ...
}

所有这些都可以正常工作。但是我需要的,却找不到如何在hub中做到这一点,就是知道哪些客户端连接,知道我是否应该为这些客户端创建数据存储库,并避免进行不必要的数据库查询。

myHub.cs

Timer_tick()
  {
  ...
  //Collect data to clients Type 1
  ...
  Clients.All.UpdateDataType1(jsonData);
  ...
  //Collect data to clients Type 2
  ...
  Clients.All.UpdateDataType2(jsonData);
  ...
  //Collect data to clients Type 3
  ...
  Clients.All.UpdateDataType3(jsonData);

ClientType1.aspx.js (2 clients connected)
    hub.client.UpdateDataType1= function (jsonData) {...);
ClientType2.aspx.js (0 clients connected)
    hub.client.UpdateDataType2= function (jsonData) {...);
ClientType2.aspx.js (0 clients connected)
    hub.client.UpdateDataType3= function (jsonData) {...);

我知道当我调用客户端2和3函数时,我不需要担心客户端是否连接。但我需要避免获取我不会使用的数据。目标只是获取数据,我将使用到连接的客户端。

我所能做的就是看看是否有客户端,但不知道是否有特定js的客户端

有办法知道这个吗?

您可以为此使用组,并且可以编写跨页面可重用的JavaScript代码。在开始连接之前,JavaScript可以这样做:

$.connection.hub.qs = { referer: document.location.pathname };

这种方式将调用页存储在查询字符串键中。当然,您可以存储任何您认为对您的目标有用的其他信息。然后你可以把它放在你的集线器中:

    public override Task OnConnected()
    {
        var referer = Context.Request.QueryString["referer"];
        Groups.Add(Context.ConnectionId, referer);
    }

这样,每个客户端都将通知正在使用哪个库,并且使用针对客户端信息创建的组,您可以轻松地根据客户端类型针对它们。不需要在内存中存储任何东西,这总是有很多缺点。

您可以检查该链接以将用户映射到连接。如果您看一下内存解决方案,您将能够检索已连接用户的列表。

最新更新