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