我们有几个客户端通过signalr连接到服务器。最近我们发现了一个奇怪的行为,它在我们从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停止/启动实体后不传递消息的情况。