2009-09-11 69 views
8

我正在检查一些遗留代码,并且发现导致响应无限期地停滞的错误。是否需要在响应头中设置Content-Length?

这里的基本思想是:

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() 

的问题是,someStoredLength比someByteArray的实际尺寸要大得多,所以客户端只是坐在那里等待文件下载,而浏览器只是旋转。

我在考虑只是删除指定内容长度的AddHeader,因为当我这样做时,一切似乎都正常,但我担心我不理解某些内容。

我可以删除这个AddHeader还是应该找出一个更好的方法来处理这个问题?

+0

什么语言是什么?上述代码中的Response对象是什么类? – noctonura 2009-09-11 18:43:22

+0

@RichAmberale:这与问题无关。由于HTTP标头,问题发生在浏览器上。 – 2009-09-11 18:47:22

+0

该代码是在VB.NET中,但我可能会发现在其他地方传统是在ASP经典 – Joseph 2009-09-11 18:48:12

回答

8

更改内容长度线以下:

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

我也在考虑这样做。我想知道这是否是一个好的选择。如果我有一个字节数组的长度属性总是给我正确的大小? – Joseph 2009-09-11 18:53:28

+0

是的。内容长度标题指示内容中的字节数。你的内容是一个字节数组,所以你很好。 – Stephen 2009-09-11 20:04:12

10

您的应用SHOULD(向下滚动到Content-Length)将其定义,但不是严格要求。

这是decent discussion的可能选项。

+2

链接的文章中提出的解决方案(“只是将长度设置为一些任意值,这可能会太大)”似乎是一个真正的不好主意。即使它不会破坏当前用户代理的任何内容,它也会破坏“Content-length”头的整个概念,并可能破坏罕见但完全符合标准的HTTP客户端库。如果事先不知道文件的大小,则应在所有情况下使用分块传输编码(并且必须在连接将被重用(保持活动状态)时使用)。 – lxgr 2012-01-26 10:27:49

+0

直接链接到[Content-Length](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13),另请参见[HttpBis](http://tools.ietf.org /html/draft-ietf-httpbis-p1-messaging-25#section-3.3.2) – paulkmoore 2014-01-16 23:35:19

相关问题