c# WebResponse内容长度限制

本文关键字:长度限制 WebResponse | 更新日期: 2023-09-27 18:13:05

我正试图用c#与WebRequest从互联网获取一个大文件。到目前为止,我所拥有的所有其他东西都工作得很好,但似乎在我得到的响应中间的某些部分被删除了。我试着打印出response.ContentLengthgetResponseContent(response).Length,我分别得到了-180000WebResponse长度是否有限制,或者是有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而不是一些有意义的长度?

c# WebResponse内容长度限制

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

然而-回应。ContentLength是HTTP响应的报头值,它是响应的长度,以字节为单位

字符串中有多少字符并不一定是同一件事-许多unicode类型编码每个字符不止一个字节。

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

您没有使用responseStream.Read的返回值来查找收到了多少字节

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

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