IIS7 - 在ASP中指定内容长度标头会导致“连接重置”错误

时间:2010-06-14 19:18:36

标签: iis iis-7 asp-classic content-length

我正在将一系列网站从现有的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等)才会失败。否则仍然完全无能为力。

3 个答案:

答案 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)

有两种方法可以使它发挥作用:

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

  2. (首选)将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”,大小