我们有几台运行ASP.NET Web API应用程序的服务器。可以从用C#编写的Windows桌面客户端应用程序访问Web API。客户端使用SignalR HubConnection
对象启动与服务器的反向通道,通过该服务器接收实时反馈(日志语句,状态等)。去年,我们的一位用户报告说客户端经常遇到以下错误:
远程主机强行关闭现有连接
引发HubConnection.Error
事件时收到此错误。我深入研究了服务器端的Windows事件查看器日志,发现这些错误与以下事件的发生完全一致:
为应用程序池提供服务的流程' ASP.NET v4.0'关闭期间超出时间限制。流程ID为'xxxx'。
此事件紧接着应用程序池回收事件后的90秒:
进程ID为'xxxx'的工作进程服务应用程序池' ASP.NET v4.0'已请求回收,因为工作进程达到了允许的处理时间限制。
很明显,为ASP.NET v4.0应用程序池提供服务的旧工作进程无法在ShutdownTimeLimit中关闭90秒。我做了一些进一步的实验,发现请求队列中保留了以下请求导致强制关闭工作进程:
我们当时使用的SignalR库的版本是1.0.20228.0。
去年,我们在客户端和服务器上升级到SignalR版本2.2.31215.272。看来这个改变解决了我上面描述的问题。 ' signalr / connect'请求仍然在集线器连接的生命周期内保留,但是当应用程序池循环使用时,客户端和服务器会正常地重新连接它,而不会出现任何问题。显然,SignalR V1和V2之间有一些修复,它允许它以更加优雅的方式处理应用程序池回收事件。
仅仅为了我自己的理解,为什么这个问题是由SignalR库的V1引起的,以及在V1和V2之间发生什么变化解决了这个问题?
感谢。