当前位置: 首页 > 编程语言 > C#

使用HttpWebResponse读取“分块”响应分享

时间:2023-04-10 14:23:23 C#

使用HttpWebResponse读取“分块”响应问题://responseisanHttpWebResponseStreamReaderreader=newStreamReader(response.GetResponseStream());字符串输出=reader.ReadToEnd();//抛出异常...当reader.ReadToEnd()方法时,我得到以下系统.IO.IOException:无法从传输连接读取数据:连接已关闭。当服务器返回“非分块”响应时,上面的代码工作得很好。我能够让它工作的唯一方法是对初始请求使用HTTP/1.0(而不是默认的HTTP/1.1),但这似乎是一个蹩脚的解决方法。有任何想法吗?@Chuck您的解决方案完美无缺。它仍然在最后一个Read()上抛出相同的IOExeception。但是在检查StringBuilder的内容之后,看起来所有数据都已收到。所以也许我只需要将Read()包装在try-catch中并吞下“错误”。没有尝试使用“分块”响应进行此操作,但是这样的操作可行吗?StringBuildersb=newStringBuilder();字节[]buf=新字节[8192];流resStream=response.GetResponseStream();字符串tmpString=null;整数计数=0;做{count=resStream.Read(buf,0,buf.Length);如果(计数!=0){tmpString=Encoding.ASCII.GetString(buf,0,计数);sb.Append(tmpString);}}while(count>0);我正在处理类似的问题。.netHttpWebRequest和HttpWebRequest自动处理cookie和重定向,但它们不会自动处理响应正文中的分块内容。这可能是因为分块内容可能包含的不仅仅是简单的数据(即:分块名称、尾部标头)。简单地读取流并忽略EOFexception是行不通的,因为流包含的内容超出了需要。流将包含块,每个块首先声明其大小。如果您只是从头到尾读取流,最终数据将包含块元数据(对于其gzip内容,它将无法通过解压时的CRC检查)。要解决此问题,必须手动解析流,从每个块(和CRLF定界符)中删除块大小,检测最终块并仅保留块数据。那里可能有一个图书馆可以做到这一点,我还没有找到它。有用的资源:http://en.wikipedia.org/wiki/Chunked_transfer_encodinghttp://tools.ietf.org/html/rfc2616#section-3.6.1Craig,如果没有看到你正在阅读的流,它有点难以理解debug但您可以将count变量的设置更改为:count=resStream.Read(buf,0,buf.Length-1);这有点hack,但如果最后一次读取让你丧命并且它没有返回任何数据,那么理论上这可以避免这个问题。我仍然想知道为什么流要这样做。我遇到了同样的问题(这就是我的结局:-)。最终追溯到分块流无效的事实——最后一个零长度的块丢失了。我想出了以下代码,它处理有效和无效的分块流。以上就是C#学习教程:使用HttpWebResponse读取“分块”响应共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望你多多关注——using(StreamReadersr=newStreamReader(response.GetResponseStream(),Encoding.UTF8)){StringBuildersb=newStringBuilder();尝试{while(!sr.EndOfStream){sb.Append((char)sr.Read());}}catch(System.IO.IOException){}字符串内容=sb.ToString();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: