c#WebResponse内容长度限制

时间:2014-07-14 15:52:10

标签: c# stream httpwebrequest webrequest

我正在尝试使用带有WebRequest的C#从互联网上获取大文件。到目前为止,我所有其他的东西都运行良好,但似乎我得到的响应中间的某些部分被删除了。我尝试打印response.ContentLengthgetResponseContent(response).Length,我分别得到了-180000WebResponse长度是否有限制,或者是有问题的帮助函数?我如何获得完整内容?

这是我的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而不是有意义的长度?

3 个答案:

答案 0 :(得分:1)

您没有使用responseStream.Read的返回值来查找已接收的字节数。

答案 1 :(得分:1)

如果不知道您收到的实际数据是什么,很难确定发生了什么。

但是 - response.ContentLength是HTTP响应的标头值,它是响应的长度,以字节为单位

表示的字符串中有多少个字符不一定相同 - 许多unicode类型编码每个字符超过一个字节。

使用responseStream.Read重载将二进制数据放入byte []缓冲区,根据实际编码(在标题中设置)创建解码器并从那里解码字符串。

答案 2 :(得分:1)

ContentLength是一个http标头。如果服务器端没有发送它,您将收到-1。这不是强制性的。

这就是为什么使用ResponseStream是一个好主意。