我正在尝试使用带有WebRequest
的C#从互联网上获取大文件。到目前为止,我所有其他的东西都运行良好,但似乎我得到的响应中间的某些部分被删除了。我尝试打印response.ContentLength
和getResponseContent(response).Length
,我分别得到了-1
和80000
。 WebResponse
长度是否有限制,或者是有问题的帮助函数?我如何获得完整内容?
这是我的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();
}
但是,仍然可以解释为什么响应头中的ContentLength是-1而不是有意义的长度?
答案 0 :(得分:1)
您没有使用responseStream.Read
的返回值来查找已接收的字节数。
答案 1 :(得分:1)
如果不知道您收到的实际数据是什么,很难确定发生了什么。
但是 - response.ContentLength是HTTP响应的标头值,它是响应的长度,以字节为单位。
表示的字符串中有多少个字符不一定相同 - 许多unicode类型编码每个字符超过一个字节。
使用responseStream.Read重载将二进制数据放入byte []缓冲区,根据实际编码(在标题中设置)创建解码器并从那里解码字符串。
答案 2 :(得分:1)
ContentLength是一个http标头。如果服务器端没有发送它,您将收到-1。这不是强制性的。
这就是为什么使用ResponseStream是一个好主意。