SignalR客户端由于不活动而停止连接。

13

我在一个控制台应用程序中使用了SignalR Hub,同时有一个WPF客户端。 连接初始化时,SignalR连接将被建立,并且应始终保持活动状态。 每秒钟服务器都会向客户端推送一条带有当前系统时间的消息(可以在日志中看到“SystemTimeUpdateNotification”)。

现在我描述的行为是在Windows7设备上的:偶尔我会发现客户端失去与服务器的连接。 由于某种原因,客户端检测到自己已经处于非活动状态并停止连接。我不知道“自4/20/2017 3:04:06 AM以来处于非活动状态”和“超时00:00:50”的信息从何而来。 如果我在同一时间检查服务器上的日志,我可以看到没有keepalive消息。

    2017-04-20 05:04:04.0728,Trace,Received notification SystemTimeUpdateNotification
    2017-04-20 05:04:05.0859,Trace,Received notification SystemTimeUpdateNotification
    2017-04-20 05:04:06.0999,Trace,Received notification SystemTimeUpdateNotification
    2017-04-20 05:05:13.1020,Trace,Received notification SystemTimeUpdateNotification
    2017-04-20 05:05:14.1160,Trace,Received notification SystemTimeUpdateNotification
    2017-04-20 05:05:14.5511,Info,客户端自4/20/2017 3:04:06 AM以来一直处于非活动状态,已超过非活动超时时间00:00:50。正在停止连接。
    2017-04-20 05:05:14.5871,Info,SignalR连接状态从“已连接”更改为“已断开连接”
    2017-04-20 05:05:14.5871,Trace,Received notification NotificationConnectionStateChanged
    2017-04-20 05:05:14.5981,Info,正在断开连接...
    2017-04-20 05:05:14.5981,Info,取消正在进行的操作2017年4月20日05:05:19.6104,信息,SignalR连接状态从“已断开”变为“正在连接”
2017年4月20日05:05:19.6104,跟踪,收到通知NotificationConnectionStateChanged
2017年4月20日05:05:19.6104,信息,正在断开连接...
2017年4月20日05:05:19.6454,信息,SignalR连接状态从“正在连接”变为“已连接”
2017年4月20日05:05:19.6454,跟踪,收到通知NotificationConnectionStateChanged
2017年4月20日05:05:19.6454,信息,正在连接...
2017年4月20日05:05:19.6524,调试,执行客户端/服务器兼容性检查
2017年4月20日05:05:19.6524,调试,软件兼容
2017年4月20日05:05:19.6524,信息,开始检索初始数据
2017年4月20日05:05:20.0344,信息,已检索到初始数据
2017年4月20日05:05:20.2044,跟踪,收到通知SystemTimeUpdateNotification
2017年4月20日05:05:21.2144,跟踪,收到通知SystemTimeUpdateNotification
服务器端的日志:
2017年4月20日05:03:31.6069;跟踪;KeepAlive(6a12952a-1cb4-4933-b6b1-db16158958a9) 2017年4月20日05:03:41.6225;跟踪;KeepAlive(6a12952a-1cb4-4933-b6b1-db16158958a9) 2017年4月20日05:03:51.6371;跟踪;KeepAlive(6a12952a-1cb4-4933-b6b1-db16158958a9)2017-04-20 05:04:01.6527;Trace;KeepAlive(6a12952a-1cb4-4933-b6b1-db16158958a9) 2017-04-20 05:05:14.5661;Info;Abort(6a12952a-1cb4-4933-b6b1-db16158958a9) 2017-04-20 05:05:14.5661;Info;删除连接6a12952a-1cb4-4933-b6b1-db16158958a9 2017-04-20 05:05:14.5661;Info;End(6a12952a-1cb4-4933-b6b1-db16158958a9) 2017-04-20 05:05:14.5841;Trace;DrainWrites(6a12952a-1cb4-4933-b6b1-db16158958a9) 2017-04-20 05:05:14.5841;Info;CompleteRequest (6a12952a-1cb4-4933-b6b1-db16158958a9) 2017-04-20 05:05:19.6344;Info;连接9249a8a5-8653-450c-b8da-c5b7a4c7df81是新的。 2017-04-20 05:05:27.6738;Trace;KeepAlive(9249a8a5-8653-450c-b8da-c5b7a4c7df81) 2017-04-20 05:05:37.6874;Trace;KeepAlive(9249a8a5-8653-450c-b8da-c5b7a4c7df81)

现在我来到真正奇怪的部分。那个“偶尔”的时间间隔实际上是相当固定的。我查看了过去几天的日志条目,它总是大约每11小时左右出现一次。

不活动   时间戳      与先前的差异              日志条目自2017年4月17日下午3:58:35以来,客户端一直处于非活动状态,并且超过了00:00:50的非活动超时时间。正在停止连接。
自2017年4月17日下午3:58:35以来,客户端一直处于非活动状态,并且超过了00:00:50的非活动超时时间。正在停止连接。
自2017年4月17日上午4:57:34以来,客户端一直处于非活动状态,并且超过了00:00:50的非活动超时时间。正在停止连接。
自2017年4月16日下午6:56:29以来,客户端一直处于非活动状态,并且超过了00:00:50的非活动超时时间。正在停止连接。
自2017年4月16日上午7:55:23以来,客户端一直处于非活动状态,并且超过了00:00:50的非活动超时时间。正在停止连接。
自2017年4月15日晚上8:54:17以来,客户端一直处于非活动状态,并且超过了00:00:50的非活动超时时间。正在停止连接。
自2017年4月15日上午9:53:09以来,客户端一直处于非活动状态,并且超过了00:00:50的非活动超时时间。正在停止连接。
自2017年4月15日上午9:53:09以来,客户端一直处于非活动状态,并且超过了00:00:50的非活动超时时间。正在停止连接。客户端自2017年4月14日晚上10:52:03以来一直处于非活动状态,已经超过了00:00:50的非活动超时时间。正在停止连接。
客户端自2017年4月14日上午11:50:58以来一直处于非活动状态,已经超过了00:00:50的非活动超时时间。正在停止连接。
客户端自2017年4月14日凌晨12:49:52以来一直处于非活动状态,已经超过了00:00:50的非活动超时时间。正在停止连接。
是否存在最大连接时间或可能导致此行为的原因?
编辑1: 如果我在Window 8上运行相同的代码,则没有此问题。 我想这与Windows 7上正在使用的传输方法有关(不支持WebSockets)。
编辑2:
服务器 客户端 非活动问题 Win 8 Win 8 否 Win 7 Win 7 是 Win 7 Win 8 否 Win 8 Win 7 是
因此,它似乎与客户端的操作系统有关。

听起来像是IIS回收时间... - thab
1
那不可能是问题,因为我没有使用IIS。 - Joris
1个回答

2

根据文档所述,保持连接的一种方法是在断开连接后不断重新连接。在客户端中设置断开函数即可。

$.connection.hub.disconnected(function() {
   setTimeout(function() {
       $.connection.hub.start();
   }, 5000); // Restart connection after 5 seconds.
});

我已经在做这个,但我想知道为什么会出现断开连接的情况。我没有收到任何关于“ConnectionSlow”或任何指示连接存在问题的信息。我甚至在同一主机上运行它。 - Joris
我也遇到了同样的问题。@Joris,你找到解决方法了吗?这是客户端和服务器之间的时区问题吗? - UmarKashmiri
我没有找到解决方案。我不再需要支持Windows7设备,这是我不再遇到此问题的唯一原因... - Joris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接