Sha*_*eKm 5 asp.net-mvc signalr signalr-hub
我需要检查特定用户是否仍然连接.
我有以下用于跟踪用户的HashSet:
public static class UserHandler
{
public static HashSet<string> ConnectedIds = new HashSet<string>();
}
Run Code Online (Sandbox Code Playgroud)
因此断开连接:
public override Task OnDisconnected()
{
UserHandler.ConnectedIds.Remove(this.Context.ConnectionId);
if (UserHandler.ConnectedIds.Count == 0)
{
// STOP TASK -> SET CANCELLATION
}
return base.OnDisconnected();
}
Run Code Online (Sandbox Code Playgroud)
并在连接上:
public override Task OnConnected()
{
Logger.Log.file.Info("[TaskActionStatus HUB => OnConnected] Start");
UserHandler.ConnectedIds.Add(this.Context.ConnectionId);
// start task only if at least one listener
if (UserHandler.ConnectedIds.Count < 2)
{
// START A TASK -> (WHILE LOOP THAT GETS DATA FROM DB EVERY 2 SEC)
}
return base.OnConnected();
}
Run Code Online (Sandbox Code Playgroud)
现在,当用户只是关闭他/她的浏览器窗口时就会出现问题.我无法知道他/她是否断线.
所以基于这里的一些问题,我会打电话给每个客户并得到回复.我不知道怎么做.
我猜我会这样:
public static void CheckConnectedUsers()
{
var context = GlobalHost.ConnectionManager.GetHubContext<TaskActionStatus>();
foreach (var connection in UserHandler.ConnectedIds)
{
context.Clients.Client(connection).verifyConnected("online?");
}
}
Run Code Online (Sandbox Code Playgroud)
但是如何从客户端获得回复?
编辑:执行的步骤:
我需要连接的确切用户数,因为如果连接了至少一个用户,我需要启动一个任务.我想确保所有连接用户<2(启动任务)只运行1个任务.假设这样的情况:2个用户查看使用signalR的页面.HashSet现在包含2个ID,并且正在运行任务.一个关闭他/她的浏览器,几秒钟后,另一个刷新他/她的浏览器.现在,第一个(关闭他/她的浏览器的那个没有执行OnDisconnected方法,所以HashSet仍然有他/她的ConnectionId,而"刷新"的那个确实执行OnDisonnected,然后OnConnected将connectionId添加到HashSet.所以相反在HashSet中只有一个ConnectionId并启动一个任务,HashSet包含2个(旧的 - 不再连接,只是刷新他/她的浏览器的那个),并且任务再也没有开始.
谢谢
使用SignalR 1.0 OnDisconnected时,即使用户关闭窗口,也应始终触发(如果服务器重新启动,则会出现异常).
OnDisconnected 可能不会立即触发,因为如果客户端没有"中止"连接,则它被认为是"不干净",因为客户端可能会尝试重新连接(如果您重新连接,则根据SignalR的语义没有断开连接).
默认情况下,服务器需要大约30秒才能调用OnDisconnected"不干净"的断开连接.这可以通过重新配置GlobalHost.Configuration.DisconnectTimeout.
| 归档时间: |
|
| 查看次数: |
4164 次 |
| 最近记录: |