我正在将一系列网站从现有的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:多做了一些试验和错误。如果“启用缓冲”和“启用分块编码”都为假,则请求将成功。如果其中任何一个启用,则会发生错误。
编辑2 :更多试验和错误测试;事实证明,文本文件可以正常使用脚本;只有二进制文件(图像,pdf等)才会失败。否则仍然完全无能为力。
答案 0 :(得分:8)
正如其他地方已经提到的那样: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 set config / section:asp / enableChunkedEncoding:True | False
True启用HTTP 1.1分块传输编码,而False禁用 HTTP 1.1分块传输编码。默认值为True。
我们遇到了同样的问题,我们的解决方案:删除AddHeader“Content-Length”
答案 1 :(得分:2)
有两种方法可以使它发挥作用:
输出“Content-Size”标题,而不是“Content-Length”。请注意,并非所有客户都会认识到这一点,但至少它是有效的。
(首选)将Response.Buffer设置为True,然后您可以使用“Content-Length”标头,并自己处理“chunking”(因此不会对ASP内存缓冲区产生负担):
< / LI> 醇>以下适用于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
答案 2 :(得分:1)
将ASP代码从Windows 2003服务器迁移到使用IIS 8.5的Windows 2012时遇到同样的问题。解决方法是按如下方式调整ASP代码:
自:
Response.Addheader“Content-Length”,大小
要:
Response.Addheader“Content-Size”,大小