SignalR(版本1)在应用程序池回收期间与服务器的集线器连接

时间:2016-10-27 14:37:20

标签: c# asp.net asp.net-mvc-4 asp.net-web-api signalr-hub

我们有几台运行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 connect request

我们当时使用的SignalR库的版本是1.0.20228.0。

去年,我们在客户端和服务器上升级到SignalR版本2.2.31215.272。看来这个改变解决了我上面描述的问题。 ' signalr / connect'请求仍然在集线器连接的生命周期内保留,但是当应用程序池循环使用时,客户端和服务器会正​​常地重新连接它,而不会出现任何问题。显然,SignalR V1和V2之间有一些修复,它允许它以更加优雅的方式处理应用程序池回收事件。

仅仅为了我自己的理解,为什么这个问题是由SignalR库的V1引起的,以及在V1和V2之间发生什么变化解决了这个问题?

感谢。

0 个答案:

没有答案