2009-09-11 29 views
8

Estoy revisando algún código heredado y he encontrado un error que provoca que la respuesta permanezca indefinidamente.¿Es necesario establecer Content-Length en mi encabezado de respuesta?

Aquí es la idea básica:

Response.Content-Type = "application/octet-stream" 
Response.AddHeader("Content-Disposition", "attachment; filename" & someFileName) 
Response.AddHeader("Content-Length", someStoredLength) 
Response.BinaryWrite(someByteArray) 
Response.Flush() 
Response.End() 

El problema es que someStoredLength es mucho más grande que el tamaño real de someByteArray, por lo que el cliente sólo se sienta allí esperando la descarga del archivo, mientras que el browser gira.

Estoy considerando eliminar AddHeader que especifica la longitud del contenido, porque cuando lo hago todo parece funcionar bien, pero me preocupa no entender nada.

¿Puedo desinstalar esta AddHeader o debería encontrar una forma mejor de solucionar este problema?

+0

¿Qué idioma es esto? ¿Qué clase es el objeto Response en el código anterior? – noctonura

+0

@RichAmberale: Eso no es realmente relevante para la pregunta. El problema ocurre en el navegador debido a los encabezados HTTP. –

+0

El código está en VB.NET pero podría encontrarlo en otros lugares donde el legado se hace en ASP clásico – Joseph

Respuesta

8

Cambie la línea Content-Length a lo siguiente:

Response.AddHeader("Content-Length", someByteArray.Length.ToString()) 
+0

Estaba pensando en hacer eso también. Me preguntaba si esa sería una buena alternativa. Si tengo una matriz de bytes, ¿la propiedad Length siempre me dará el tamaño correcto? – Joseph

+0

Sí. El encabezado content-length indica la cantidad de bytes en el contenido. Su contenido es una matriz de bytes, por lo que está bien. – Stephen

10

Su aplicación SHOULD (baje hasta Content-Length) la define, sin embargo, no es estrictamente necesaria.

Aquí hay un decent discussion de posibles opciones.

+2

La solución propuesta en el artículo vinculado ("simplemente ajuste la longitud a un valor arbitrario que probablemente sea demasiado grande") parece una REALMENTE mala idea. Incluso si no rompe nada con los agentes de usuario actuales, socava todo el concepto del encabezado "Content-length", y podría romperse poco común, pero con bibliotecas de clientes HTTP completamente compatibles con los estándares. Si el tamaño del archivo no se conoce de antemano, la codificación de transferencia fragmentada se debe usar en todos los casos (y se debe usar si la conexión se va a reutilizar (keep-alive)). – lxgr

+0

Enlace directo a [Content-Length] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13), consulte también [HttpBis] (http://tools.ietf.org /html/draft-ietf-httpbis-p1-messaging-25#section-3.3.2) – paulkmoore

Cuestiones relacionadas