【发布时间】:2010-07-09 18:14:00
【问题描述】:
我遇到了此处记录的问题:
http://support.microsoft.com/kb/914453
您访问 Web 应用程序或 Web 来自 Web 服务器的站点,该服务器使用 分块传输编码 基于 Microsoft Windows Server 2003 或 在基于 Microsoft Windows XP 的 电脑。然后,浏览器或网络 应用程序停止响应。
这个问题发生在 Wininet.dll 文件收到一个 期间数据块不完整 初始 Winsock 数据接收 手术。当这种行为发生时, 第二个 Winsock 数据接收 操作只读取一个块令牌。 比如第二个Winsock数据 接收操作只能读取 回车换行 (CRLF) 从 插座。然后,Wininet.dll 文件 连续调用 Winsock 选择功能 30 秒。这 文件正在等待接收更多数据。 但是,如果没有数据到达,则 浏览器或 Web 应用程序停止 回应。
我为从数据库中检索文件而实现的 HttpHandler 出现了问题。相关代码为:
var buffer = GetSomeByteArray();
context.Response.Clear();
context.Response.ContentType = type;
context.Response.BinaryWrite(buffer);
context.Response.End();
我可以通过关闭动态压缩或不将 .axd 指定为可压缩文件类型来禁用 IIS 6 级别的分块编码,但我不想这样做。我的问题是,我的代码中是否存在错误或者我没有做的事情应该会阻止浏览器接收不完整的块?
【问题讨论】:
-
我不做 ASP/IIS,但是在 JSP/Servlet 的情况下,只有在发出响应之前没有设置内容长度标头时才会使用分块编码。如果您设置内容长度标头,则将使用流式传输模式。看看它是否有助于您的 ASP/IIS 应用预先设置内容长度。
-
IIS 在必须压缩“动态”内容时将强制分块编码,因为它不会缓存它,因此压缩会即时进行。这里的问题不是压缩 - 这正是首先触发分块编码的原因。事实上,我的代码中有一行添加了 Content-length 标头,但 IIS 在使用分块编码时不会发送 Content-length 标头,因为这会违反规范。