我在我的网站上使用信号器。我只有一个继承自hub的类,以及一些带有客户端代码的aspx表单,这些客户端代码具有由集线器调用的客户端函数。
当客户端连接到集线器时,我将其添加到具有clientID的集合中,当客户端断开连接时,我将其从该集合中删除。只是想知道是否有任何客户端连接。只要连接了至少一个客户端,计时器就会调用一些方法来填充传播给客户端的服务器上的数据存储库。
然后我通常会在向客户打电话之前做这样的事情:
if (users.Count() > 0)
{
this.Clients.All.UpdateData(JsonConvert.SerializeObject(someData));
...
}
这一切都很好。但是,我需要并且无法在集线器中找到如何做到这一点,就是知道客户端连接的是什么,知道我是否应该为这些客户端创建数据存储库,并避免进行不必要的数据库查询。
例如
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
有没有办法知道这个?
答案 0 :(得分:1)
您可以使用组,并且可以编写可跨页面重用的JavaScript代码。在开始连接之前,您的JavaScript可以执行此操作:
$.connection.hub.qs = { referer: document.location.pathname };
这样您就可以将调用页面存储在查询字符串键中。当然,您可以存储您认为对您的目标有用的任何其他信息。然后你可以在你的集线器中拥有它:
public override Task OnConnected()
{
var referer = Context.Request.QueryString["referer"];
Groups.Add(Context.ConnectionId, referer);
}
这样,每个客户端都会通知您正在使用的库,并且根据客户端信息创建的组可以轻松地按客户端类型定位它们。无需在内存中存储任何内容,这一直存在许多缺点。
答案 1 :(得分:0)
您可以检查link以将用户映射到连接。如果您查看内存中的解决方案,您将能够检索已连接用户的列表。