Signalr 如何知道什么类型的客户端连接到信号集线器?

Signalr 如何知道什么类型的客户端连接到信号集线器?,signalr,Signalr,我正在我的网站上使用信号器。我只有一个从hub继承的类,还有几个带有客户机代码的aspx表单,它们具有由hub调用的客户机函数 当客户端连接到集线器时,我将其添加到具有clientID的集合中,当客户端断开连接时,我将其从该集合中删除。只是想知道是否有任何客户端已连接。只要至少连接了一个客户机,计时器就会调用一些方法来填充服务器上传播到客户机的数据存储库 在给客户打电话之前,我通常会这样做: if (users.Count() > 0) { this.Clients.All.Up

我正在我的网站上使用信号器。我只有一个从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);
    }
这样,每个客户机都将通知正在使用哪个库,通过根据客户机信息创建的组,您可以很容易地按客户机类型将它们作为目标。不需要在内存中存储任何东西,这总是有很多缺点