IIS7 - Specifying content-length header in ASP causes “connection reset” error

前端 未结 3 667
庸人自扰
庸人自扰 2021-01-12 04:43

I\'m migrating a series of websites from an existing IIS5 server to a brand new IIS7 web server. One of the pages pulls a data file from a blob in the database and serves i

相关标签:
3条回答
  • 2021-01-12 05:27

    There are two options to make it work:

    1. Output the "Content-Size" header, instead of "Content-Length". Note not all clients will recognise that, but at least it works.

    2. (Preferred) Set Response.Buffer to True, then you can use the "Content-Length" header, and handle the "chunking" yourself (thus not taxing the ASP memory buffer):

    The following works for me on IIS7, and seems to send file size info correctly to the browser.

    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
    
    0 讨论(0)
  • 2021-01-12 05:38

    Encountered this same issue when migrating ASP code from a Windows 2003 server to Windows 2012 with IIS 8.5. The fix was to adjust the ASP code as follows:

    From:

    Response.Addheader "Content-Length", Size

    To:

    Response.Addheader "Content-Size", Size

    0 讨论(0)
  • 2021-01-12 05:43

    As already mentioned somewhere else: http://en.wikipedia.org/wiki/Chunked_transfer_encoding

    It uses the Transfer-Encoding HTTP response header in place of the Content-Length header, which the protocol would otherwise require. Because the Content-Length header is not used, the server does not need to know the length of the content before it starts transmitting a response to the client (usually a web browser). Web servers can begin transmitting responses with dynamically-generated content before knowing the total size of that content.

    In IIS7 this is enabled by default: http://technet.microsoft.com/en-us/library/cc730855(v=ws.10).aspx

    To enable HTTP 1.1 chunked transfer encoding for the World Wide Web publishing service, use the following syntax:

    appcmd set config /section:asp /enableChunkedEncoding:True|False

    True enables HTTP 1.1 chunked transfer encoding whereas False disables HTTP 1.1 chunked transfer encoding. The default value is True.

    We had the same problem, our solution: remove AddHeader "Content-Length"

    0 讨论(0)
提交回复
热议问题