【问题】
C#中,网络抓取amazon的时候,有时候,会遇到一个情况:
获得了HttpWebResponse后,使用StreamReader的ReadToEnd,读取html内容;
一般的情况下,都是正常的,但是有时候会出现死掉,无限期的死掉,挂掉的情况。
调试的似乎,始终停在:
respHtml = sr.ReadToEnd();
的位置。
相关代码如下:
HttpWebResponse resp = getUrlResponse(url, headerDict, postDict, timeout, postDataStr); //long realRespLen = resp.ContentLength; if (resp != null) { StreamReader sr; if ((charset != null) && (charset != "")) { Encoding htmlEncoding = Encoding.GetEncoding(charset); sr = new StreamReader(resp.GetResponseStream(), htmlEncoding); } else { sr = new StreamReader(resp.GetResponseStream()); } respHtml = sr.ReadToEnd(); }
【解决过程】
1.参考:
StandardOutput.ReadToEnd() hangs
但是和此处不完全相同。
2.参考官网的解释:
就有:
ReadToEnd 假定流在到达末尾时会知道已到达末尾。对于交互式协议(服务器仅当被请求时才发送数据而且不关闭连接),ReadToEnd 可能被无限期阻止,应避免出现这种情况。 |
所以,我此处,看来就像是此种情况:
amazon服务器端,不知何故?
导致此处ReadToEnd始终得不到如何结束,所以就一直读,就挂掉了?
3.还是参考:
StandardOutput.ReadToEnd() hangs
去试试Peek,看看效果。
但是还是觉得不好用。
4.参考:
HttpWebRequest Timeout (Hangs) Help
添加上对应的close:
//long realRespLen = resp.ContentLength; if (resp != null) { StreamReader sr; if ((charset != null) && (charset != "")) { Encoding htmlEncoding = Encoding.GetEncoding(charset); sr = new StreamReader(resp.GetResponseStream(), htmlEncoding); } else { sr = new StreamReader(resp.GetResponseStream()); } respHtml = sr.ReadToEnd(); sr.Close(); resp.Close(); }
看看是否还会出现ReadToEnd挂掉的问题。
貌似debug很长时间了,的确没有出现此问题了。
5.另外,发现这人:
ReadToEnd hangs on stream from HttpWebResponse
也遇到了类似的问题。但是他那里很奇怪,是已经加了Close的,结果遇到接受的html太大,而导致挂掉的。
【总结】
暂时貌似解决了ReadToEnd(永久)挂掉的问题了。
即使没有解决了,那么对于:
StreamReader,HttpWebResponse
使用完毕,加上对应Close,也是正确有效的做法。
转载请注明:在路上 » 【基本解决】C#中对于HttpWebResponse使用StreamReader的ReadToEnd,结果无限期死掉/挂掉了