c#网络响应内容长度限制

c#网络响应内容长度限制,c#,stream,httpwebrequest,webrequest,C#,Stream,Httpwebrequest,Webrequest,我正试图用C#withWebRequest从互联网上获取一个大文件。到目前为止,我所做的所有其他工作都很好,但是看起来我得到的反应中的某个部分被移除了。我试着打印出响应.ContentLength和getResponseContent(response).Length,我分别得到了-1和80000。WebResponse的长度有限制吗,还是helper函数有缺陷?如何获取完整内容 这是我的getResponseContent函数: private static String getRes

我正试图用C#with
WebRequest
从互联网上获取一个大文件。到目前为止,我所做的所有其他工作都很好,但是看起来我得到的反应中的某个部分被移除了。我试着打印出
响应.ContentLength
getResponseContent(response).Length
,我分别得到了
-1
80000
WebResponse
的长度有限制吗,还是helper函数有缺陷?如何获取完整内容

这是我的
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;
    }

多亏了@neolik,我重新编写了我的
getResponseContent
来使用
StreamReader
类,它的工作非常神奇。代码如下:

    private static String getResponseContent(HttpWebResponse response)
    {
        Stream responseStream = response.GetResponseStream();
        StreamReader sr = new StreamReader(responseStream);
        return sr.ReadToEnd();
    }

但是,还有人能解释为什么响应头中的ContentLength是-1而不是一些有意义的长度吗?

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

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

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

表示的字符串中有多少个字符不一定是同一件事-许多unicode类型编码每个字符多于一个字节


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

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


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

与您的问题无关,但请考虑使用字符串生成器。代码>+=
append的内存效率很低,因为它每次都会创建一个新字符串。因为您处理的是字节->字符串,所以可以使用类,应该更容易一点,使用。@newisk ReadToEnd效果很好!谢谢大家!<代码>读取(…)>0<代码>零(0)如果已经到达流的结尾@usr我指的是我写的helper函数,当时我说它有bug。。。但是谢谢anyway@Neolisk是的,他正确地终止了读取,但是他没有检查读取了多少字节。但是为什么头的长度是-1而不是有意义的长度呢?这可能是服务器端问题吗?