2010-06-14 10 views
6

Estoy migrando una serie de sitios web desde un servidor IIS5 existente a un nuevo servidor web IIS7. Una de las páginas tira de un archivo de datos desde una mancha en la base de datos y sirve para el usuario final:IIS7 - Especificar el encabezado de longitud de contenido en ASP provoca el error de "restablecimiento de conexión"

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 

Prueba esto en el nuevo IIS7 instalación, aparece un "restablecimiento de la conexión" error en Internet Explorer y Firefox. El documento se sirve correctamente si se elimina el encabezado Content-Length (pero el usuario no obtendrá una barra de progreso útil).

Cualquier idea sobre cómo corregir esto; ya sea una opción de configuración del servidor o un código?

Editar 1: Hice un poco más de prueba y error. Las solicitudes tendrán éxito si "Enable Buffering" y "Enable Chunked Encoding" son falsas. Si cualquiera de los dos está habilitado, se produce el error.

Editar 2: Más pruebas de prueba y error; resulta que los archivos de texto funcionarán bien con el script; solo fallarán los archivos binarios (imágenes, pdfs, etc.). Todavía completamente despistado de lo contrario.

Respuesta

7

Como ya se ha mencionado en otro lugar: http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Utiliza el Transfer-Encoding cabecera de respuesta HTTP en lugar de la cabecera Content-Length, que el protocolo de otro modo requerirían. Como no se utiliza el encabezado Content-Length, el servidor no necesita conocer la longitud del contenido antes de comenzar a transmitir una respuesta al cliente (generalmente un navegador web). Los servidores web pueden comenzar a transmitir respuestas con contenido generado dinámicamente antes de conocer el tamaño total de ese contenido.

En IIS7 está habilitado de forma predeterminada: http://technet.microsoft.com/en-us/library/cc730855(v=ws.10).aspx

Para habilitar HTTP 1.1 fragmentada de transferencia de codificación para el servicio de publicación World Wide Web , utilice la siguiente sintaxis:

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

True habilita la codificación de transferencia fragmentada HTTP 1.1 mientras que False desactiva HTTP 1.1 codificación de transferencia fragmentada. El valor por defecto es verdadero.

tuvimos el mismo problema, nuestra solución: eliminar AddHeader "Content-Length"

+0

Después de migrar de XP Pro a Server 2008 R2, se produjo el error. Tuve que eliminar el encabezado Content-Length para resolver el problema. – linquize

+2

Mismo problema y solución aquí. Por lo que vale, puede cambiar "Content-Length" por "Content-Size" y funcionará, aunque es posible que el cliente no reconozca ese encabezado (ahora en desuso). –

1

Hay dos opciones para hacer que funcione:

  1. salida del "Content-Tamaño" de cabecera , en lugar de "Content-Length". Tenga en cuenta que no todos los clientes lo reconocerán, pero al menos funciona.

  2. (Preferido) Conjunto Response.Buffer en True, entonces usted puede utilizar el "Content-Length" de cabecera, y manejar la "fragmentación" usted mismo (por lo tanto no gravar el búfer de memoria ASP):

Lo siguiente funciona para mí en IIS7, y parece enviar información de tamaño de archivo correctamente al navegador.

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 
1

encontrado con este mismo problema al migrar el código ASP de un servidor de Windows 2003 a Windows 2012 con IIS 8.5. La solución fue ajustar el código ASP de la siguiente manera:

Desde:

Response.AddHeader "Content-Length", Tamaño

Para:

Response.AddHeader "Content-Size", Tamaño

Cuestiones relacionadas