我有一个托管在 IIS 中的 WCF REST 服务。客户(主要是浏览器)一直在抱怨偶尔挂起。我终于亲身体验了这一点,并且能够从服务器获取一些调试信息。我从 IIS 管理控制台抓取了以下屏幕截图。
显然,这些请求已经存在太久了。
当这些请求挂起时,服务器能够很好地处理其他请求。我多次回收应用程序池,但没有明显效果。在此期间,来自我的浏览器的任何请求都会挂起,然后被浏览器超时。我同一台机器上的其他浏览器能够毫无问题地连接到相同的服务。我还启动了 Fiddler,然后能够通过 Fiddler 从我的“挂起”浏览器发出请求。当我关闭 Fiddler 时,浏览器再次“挂起”。当我最终完全关闭浏览器时,连接消失了。
一个潜在的重要点:您无法在屏幕截图中看出,但请求都挂在向客户端发送二进制流(照片和视频)的调用上。在幕后,我从 Azure Blob 存储中打开一个流(使用 OpenRead()),然后从我的函数中返回相同的流。所以我一方面通过网络读取数据,另一方面将数据输出到网络。
那么这里发生了什么?如何防止连接挂起,或者至少让它们在某个合理的时间点超时?
更新:看来浏览器可能是问题所在。如果我<video>
在页面上有一个 HTML5 元素,并且视频足够大,浏览器似乎会打开一个连接来下载文件并永远保持打开状态。我对此只有 75% 的把握,但如果/当我确定时,我会在此处添加更新。