【问题标题】:IIS file download hangs/timeouts - sc-win32-status = 64IIS 文件下载挂起/超时 - sc-win32-status = 64
【发布时间】:2010-09-27 04:39:28
【问题描述】:

有什么想法,为什么我在尝试通过 HTTP 下载文件时可能会遇到大量“挂起”,基于以下几点?

  • 服务器是 IIS 6
  • 正在下载的文件是二进制文件,而不是网页
  • 多个客户端挂起,包括 TrueUpdate 和 FlexNet Web 更新包,以及仅执行基本 HttpWebRequest/HttpWebResponse 逻辑和使用响应流下载的自定义 .NET 应用
  • 成功时 IIS 日志文件签名为 200 0 0 (sc-status sc-substatus sc-win32-status)
  • 对于失败,错误签名是 200 0 64
  • sc-win32-status of 64 是“指定的网络名不再可用”
  • 我可以将 firefox 指向 URL 并每次都成功下载(也许某些重试逻辑正在后台发生)

在这一点上,我的服务器似乎有一些奇怪的东西抛出了这些错误,或者这只是正常的网络行为,我需要使用(或编写)一个对故障更具弹性的客户端。

有什么想法吗?

【问题讨论】:

  • 你有想过这个吗?我有同样的问题
  • 从来没有想过这个,不。我确实使用了几个网络监控工具来查看低级流量。但是在故障点的日志中没有任何东西告诉我们任何事情。我们最终选择了不同的互联网服务提供商,不再有问题。我的猜测是,该特定提供商存在较低级别的网络问题,网络连接不稳定。

标签: http iis download


【解决方案1】:

正如您在回复评论中推测的那样,您的问题可能是与 ISP 的低级别网络问题。我遇到了与 IIS 类似的问题,并且日志文件中出现了一些神秘的 200 0 64 行,这就是我找到这篇文章的方式。记录一下,这是我对 sc-win32-status=64; 的理解如果我错了,我希望有人能纠正我。

  • sc-win32-status 64 表示“指定的网络名称不再可用。”
  • 在 IIS 向客户端发送最终响应后,它会等待来自客户端的 ACK 消息。
  • 有时客户端会重置连接,而不是将最终的 ACK 发送回服务器。这不是正常的连接关闭,因此 IIS 记录“64”代码以指示中断。
  • 许多客户端在完成连接后会重置连接,以释放套接字,而不是将其留在 TIME_WAIT/CLOSE_WAIT。
  • 代理可能比个人客户更倾向于这样做。

【讨论】:

  • 这刚刚解决了我的问题。基本上,如果 web 服务客户端在 web 服务器之前超时,你会得到这个错误。
  • 我已经能够通过 window.setInterval(function() { window.location = <url>; }, 50) 在浏览器中重现此内容。所以它也可能是由行为不良的javascript引起的。
  • 啊。我在来自我们的运行状况检查服务(AWS Route 53 运行状况检查)的所有调用中都收到此错误。也许他们进行了优化以快速进行许多检查。
【解决方案2】:

我花了两周时间调查这个问题。对我来说,我遇到过间歇性随机请求被过早终止的情况。这导致 IIS 日志的状态代码为 200,但 win32 状态为 64。

我们的基础架构包括两个 Windows IIS 服务器,位于两个处于 HA 模式的 NetScaler 负载平衡器之后。

在我的特定情况下,问题在于 NetScaler 启用了一项名为“集成缓存”的功能 (http://support.citrix.com/proddocs/topic/ns-optimization-10-5-map/ns-IC-gen-wrapper-10-con.html)。

禁用此功能后,请求中断停止。并且网站正常运行。我不确定这如何或为什么会导致问题,但确实存在。

如果您使用代理或负载平衡器,请调查一下它们开启了哪些功能。对我来说,原因是客户端和服务器之间中断了请求。

我希望这个解释至少能节省别人的时间。

【讨论】:

    【解决方案3】:

    检查来自服务器的标头,尤其是内容类型和内容长度,您的客户端可能无法识别二进制文件的格式并在等待永远不会到来的字节时挂起,或者他们可能关闭了底层 TCP 连接,可能导致 IIS 记录 win32 状态 64。

    【讨论】:

      【解决方案4】:

      花了三天时间。 超时设置为 4 秒(curl php 请求)。 解决方案是增加超时设置:

      //curl_setopt($ch, CURLOPT_TIMEOUT, 4); // times out after 4s
      curl_setopt($ch, CURLOPT_TIMEOUT, 60); // times out after 60s
      

      【讨论】:

        【解决方案5】:

        您将不得不使用wireshare 或网络监视器来收集有关此问题的更多数据。我想。

        【讨论】:

          【解决方案6】:

          我建议您将Fiddler 放在您的服务器和下载客户端之间。这应该可以揭示 Firefox 和其他 cient 之间的差异。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-27
            • 2011-05-12
            • 2012-04-29
            • 2011-10-17
            • 1970-01-01
            • 1970-01-01
            • 2014-10-01
            相关资源
            最近更新 更多