c# WebResponse内容长度限制
本文关键字:长度限制 WebResponse | 更新日期: 2023-09-27 18:13:05
我正试图用c#与WebRequest
从互联网获取一个大文件。到目前为止,我所拥有的所有其他东西都工作得很好,但似乎在我得到的响应中间的某些部分被删除了。我试着打印出response.ContentLength
和getResponseContent(response).Length
,我分别得到了-1
和80000
。WebResponse
长度是否有限制,或者是有bug的辅助函数?我如何获得完整的内容?
getResponseContent
函数:
private static String getResponseContent(HttpWebResponse response)
{
Stream responseStream = response.GetResponseStream();
byte[] buffer = new byte[1000];
String ret = "";
while (responseStream.Read(buffer, 0, 1000) > 0)
ret += (System.Text.Encoding.Default.GetString(buffer));
return ret;
}
感谢@Neolisk,我已经重写了我的getResponseContent
来使用StreamReader
类,它像魔法一样工作。下面是代码:
private static String getResponseContent(HttpWebResponse response)
{
Stream responseStream = response.GetResponseStream();
StreamReader sr = new StreamReader(responseStream);
return sr.ReadToEnd();
}
然而,仍然,有人可以解释为什么在响应头的内容长度是-1而不是一些有意义的长度?
如果不知道接收到的实际数据是什么,就很难确定发生了什么。
然而-回应。ContentLength是HTTP响应的报头值,它是响应的长度,以字节为单位。
字符串中有多少字符并不一定是同一件事-许多unicode类型编码每个字符不止一个字节。
使用responseStream。读取过载,将二进制数据放入byte[]缓冲区,根据实际编码(设置在头中)创建解码器,并从那里解码字符串。
您没有使用responseStream.Read
的返回值来查找收到了多少字节
ContentLength是一个http报头。如果服务器端没有发送它,您将收到-1。这不是强制性的。
这就是为什么使用ResponseStream是一个好主意。