1

我有一个托管在 IIS 中的 WCF REST 服务。客户(主要是浏览器)一直在抱怨偶尔挂起。我终于亲身体验了这一点,并且能够从服务器获取一些调试信息。我从 IIS 管理控制台抓取了以下屏幕截图。

挂起请求

显然,这些请求已经存在太久了。

当这些请求挂起时,服务器能够很好地处理其他请求。我多次回收应用程序池,但没有明显效果。在此期间,来自我的浏览器的任何请求都会挂起,然后被浏览器超时。我同一台机器上的其他浏览器能够毫无问题地连接到相同的服务。我还启动了 Fiddler,然后能够通过 Fiddler 从我的“挂起”浏览器发出请求。当我关闭 Fiddler 时,浏览器再次“挂起”。当我最终完全关闭浏览器时,连接消失了。

一个潜在的重要点:您无法在屏幕截图中看出,但请求都挂在向客户端发送二进制流(照片和视频)的调用上。在幕后,我从 Azure Blob 存储中打开一个流(使用 OpenRead()),然后从我的函数中返回相同的流。所以我一方面通过网络读取数据,另一方面将数据输出到网络。

那么这里发生了什么?如何防止连接挂起,或者至少让它们在某个合理的时间点超时?

更新:看来浏览器可能是问题所在。如果我<video>在页面上有一个 HTML5 元素,并且视频足够大,浏览器似乎会打开一个连接来下载文件并永远保持打开状态。我对此只有 75% 的把握,但如果/当我确定时,我会在此处添加更新。

4

3 回答 3

0

Fidler 是一个代理,它会将自己注入到进程中,而不是您现有的代理。这使我相信您(和其他人)在自动代理设置或其他一些与代理设置相关的问题方面存在问题。

于 2012-05-04T04:50:17.380 回答
0

事实证明,问题完全出在浏览器上。我有一些页面中有多个<video>标签。事实证明,在某些情况下,浏览器会为每个视频打开一个连接并保持打开状态,直到视频播放完毕。

至少有几个不同的浏览器端解决方法:

  1. <video>标签上添加一个preload="none"属性。
  2. 默认情况下不显示视频。而是显示图像,然后<video>在用户单击它时动态呈现标签。

另外,我向对此做出回应的人道歉。我只是没有给你足够的信息来找到正确的答案,所以你从来没有真正的机会。

于 2012-05-08T19:01:10.227 回答
0

下次发生这种情况时,运行同一浏览器的单独实例并启动其他浏览器(Firefox、Chrome、IE 等)。您需要确定问题是否与特定浏览器有关。

我认为您在浏览器中发现了一个错误。Fiddler 的插入暂时解决了它的事实表明它与通过特定协议栈的连接状态管理有关。如果是这样,那么您会发现问题是特定浏览器实例的本地问题。

除了向浏览器供应商报告之外,您无能为力。

如果您可以证明该错误仅在 IE 和 Azure 之间出现,那么该错误可能是由 Azure 的一些怪癖触发的,在这种情况下,因为这是一个单一供应商问题,您获得解决方案的机会会从“地狱雪球”中提高“不要屏住呼吸”。

于 2012-05-04T04:06:50.270 回答