2014-03-27 17 views
0

我在我的网站上使用了signalr。我只有一个继承自集线器的类,以及一些客户端代码具有由集线器调用的客户端功能的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的功能我也不需要有关客户端是否连接担忧。但我需要避免获取我不会使用的数据。目标只是获取我将用于连接的客户端的数据。

所有我能做的就是看是否有客户,但如果有客户的一个specic JS

有没有办法知道这一点?

回答

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); 
    } 

这样每个客户端就会通知该库使用,并与你对客户信息创建的组,你可以很容易地通过客户端类型对其进行定位。不需要在内存中存储任何东西,这总是有很多缺点。

0

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

相关问题