我们有几个客户端通过信号器连接到服务器。最近我们发现了一个奇怪的行为,在我们从 IIS 完成停止和启动站点后,它无法将消息从服务器传递到客户端。(不停止 IIS 本身,只停止站点)。当从 IIS 停止和启动时,不会触发与客户端的断开连接,并且内置的 keepalive 消息中的信号器会继续运行。此外,我们自己实现了一个类似的 keepalive 方法,它返回一个布尔值,即使在 IIS 停止/启动后也可以工作。
2017-04-19 08:55:28.0875 DEBUG [TID:20 TName:] 03:25:28.0875474 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:55:38.0385 DEBUG [TID:19 TName:] 03:25:38.0385943 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:55:48.0696 DEBUG [TID:20 TName:] 03:25:48.0696881 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:55:58.1000 DEBUG [TID:19 TName:] 03:25:58.1000834 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:55:59.2373 DEBUG [TID:20 TName:] 03:25:59.2373993 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({"C":"d-F7251D27-B,0|C,8|D,0","M":[{"H":"ConnectorHub","M":"IsConnectionAlive","A":[true]}]})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:55:59.2373 DEBUG [TID:20 TName:] 03:25:59.2384003 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({"I":"21"})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:56:08.1654 DEBUG [TID:13 TName:] 03:26:08.1654216 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:56:18.0708 DEBUG [TID:20 TName:] 03:26:18.0708681 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:56:28.2090 DEBUG [TID:13 TName:] 03:26:28.2090847 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:56:38.1200 DEBUG [TID:20 TName:] 03:26:38.1200707 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:56:48.2138 DEBUG [TID:13 TName:] 03:26:48.2138197 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:56:58.2533 DEBUG [TID:20 TName:] 03:26:58.2533306 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:57:08.4435 DEBUG [TID:13 TName:] 03:27:08.4435264 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:57:18.2721 DEBUG [TID:20 TName:] 03:27:18.2721034 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
(Util.SignalrTraceWriter.Write)
2017-04-19 08:57:28.4231 DEBUG [TID:13 TName:] 03:27:28.4231487 - 68e2ca39-9b7d-4652-904f-6fa53b0e616f - WS: OnMessage({})
在上面的跟踪中,IIS 停止发生在 08:54:50 左右,启动发生在 08:55:30 左右。您可以看到没有断开连接,并且我们实现的 keepalive 和方法都可以正常通信。
问题是在包含实体(由我们定义)的 IIS 停止/启动消息无法传递之后。它尝试使用与我们发送 IsConnectionAlive 回调相同的连接 ID。但它永远不会到达客户端。这两者之间的区别是 IsConnectionAlive 仅返回一个布尔值作为参数,而其他发送实体作为参数。
2017-04-19 08:56:41.5224 DEBUG SignalRHubHelper Sent job [192453] to Connector , connection id : 68e2ca39-9b7d-4652-904f-6fa53b0e616f (SignalRHubHelper)
以上是发送实体的服务器的日志行。
奇怪的是,我们发现通过启用背板(sql 背板),即使在 IIS 停止/启动之后,它也可以与实体一起发送消息。尽管有背板,但没有其他服务器连接到背板。此行为的原因可能是什么,以及在 IIS 停止/启动实体后未传递消息的情况。