8

我正在将一系列网站从现有的 IIS5 服务器迁移到全新的 IIS7 Web 服务器。其中一个页面从数据库中的 blob 中提取数据文件并将其提供给最终用户:

Response.ContentType = rs("contentType")
Response.AddHeader "Content-Disposition", "attachment;filename=" & Trim(rs("docName"))&rs("suffix")' let the browser know the file name
Response.AddHeader "Content-Length", cstr(rs("docsize"))' let the browser know the file size

在新的 IIS7 安装中对此进行测试,我在 Internet Explorer 和 Firefox 中都收到“连接重置”错误。如果删除 Content-Length 标头,则文档将正确提供(但用户不会获得有用的进度条)。

有关如何纠正此问题的任何想法;无论是服务器配置选项还是通过代码?

编辑1:做了更多的试验和错误。如果“启用缓冲”和“启用分块编码”都为 false,则请求将成功。如果启用任何一个,则会发生错误。

编辑 2:更多的试错测试;事实证明,文本文件可以很好地与脚本配合使用;只有二​​进制文件(图像、pdf 等)会失败。否则仍然完全一无所知。

4

3 回答 3

9

正如其他地方已经提到的那样:http ://en.wikipedia.org/wiki/Chunked_transfer_encoding

它使用Transfer-Encoding HTTP 响应标头代替协议需要的 Content-Length 标头。因为没有使用Content-Length标头,所以服务器在开始向客户端(通常是 Web 浏览器)发送响应之前不需要知道内容的长度。Web 服务器可以在知道内容的总大小之前就开始使用动态生成的内容传输响应。

在 IIS7 中默认启用: http ://technet.microsoft.com/en-us/library/cc730855(v=ws.10).aspx

要为万维网发布服务启用 HTTP 1.1 分块传输编码,请使用以下语法:

appcmd 设置配置 /section:asp /enableChunkedEncoding:True|False

True 启用 HTTP 1.1 分块传输编码,而 False 禁用 HTTP 1.1 分块传输编码。默认值是true。

我们遇到了同样的问题,我们的解决方案:删除 AddHeader "Content-Length"

于 2012-03-21T09:40:36.213 回答
2

在使用 IIS 8.5 将 ASP 代码从 Windows 2003 服务器迁移到 Windows 2012 时遇到了同样的问题。修复方法是调整 ASP 代码,如下所示:

从:

Response.Addheader“内容长度”,大小

至:

Response.Addheader“内容大小”,大小

于 2015-04-20T20:47:55.403 回答
2

有两个选项可以使它工作:

  1. 输出“Content-Size”标头,而不是“Content-Length”。请注意,并非所有客户都会认识到这一点,但至少它有效。

  2. (首选)将 Response.Buffer 设置为 True,然后您可以使用“Content-Length”标头,并自己处理“分块”(因此不会对 ASP 内存缓冲区征税):

以下在 IIS7 上适用于我,并且似乎可以将文件大小信息正确发送到浏览器。

Response.Buffer = True
Response.ContentType = "application/pdf"
Response.AddHeader "Content-Disposition", "attachment; filename=""yourfile.pdf"""

Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.LoadFromFile "yourfile.pdf"

Response.AddHeader "Content-Length", objStream.Size

' Send file in chunks. '
lByteCount = 0
lChunkSize = 100000
While lByteCount < objStream.Size
  If lByteCount + lChunkSize > objStream.Size Then lChunkSize = objStream.Size - lByteCount
  Response.BinaryWrite objStream.Read(lChunkSize)
  Response.Flush ' Flush the buffer every 100KBytes '
  lByteCount = lByteCount + lChunkSize
Wend

objStream.Close
Set objStream = Nothing
于 2013-04-26T04:37:18.597 回答