我使用ASP.NET 4,MVC 2和AsyncController进行长轮询HTTP请求。如果用户关闭他们的浏览器并在没有完成请求的情况下终止HTTP连接,我想知道它并完全清理它们。如果不这样做,那么打开和不完整的请求就会坐在那里,最终IIS会停止接受新的请求。
您可以通过创建具有Thread.Sleep的页面的普通ASP.NET应用程序来模拟我长时间运行的HTTP请求。即使您关闭浏览器,请求也会继续,就好像它没有。
有一个名为Response.IsClientConnected的属性,如果客户端断开连接,它将被切换为false,我可以轮询它以达到预期的效果,但它不是很干净,我想避免轮询。有没有办法在发生这种情况时收到通知而不必轮询这个属性?
由于
答案 0 :(得分:0)
执行此操作的标准方法是使用ClientDisconnected
事件注册回调。不幸的是,ASP.NET中没有这样的事件,Response.IsClientConnected
不可靠。也许这个黑客有帮助:
创建一个页面并强制客户端通过一个非常小的图像(即1x1像素)或一个小帧请求该页面,并以特定的时间间隔从客户端发送请求(使用Javascript计时器)。请求应确定谁是客户端(使用clientId作为传递给页面的参数)。如果客户端没有信号,则可能会被您的应用程序视为已断开连接。