最新消息:20181230 VPS服务器已从Linode换到腾讯云香港,主题仍用朋友推荐的大前端D8

【基本解决】C#中对于HttpWebResponse使用StreamReader的ReadToEnd,结果无限期死掉/挂掉了

C# crifan 2573浏览 0评论

【问题】

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.参考官网的解释:

StreamReader.ReadToEnd 方法

就有:

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,结果无限期死掉/挂掉了

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
59 queries in 0.145 seconds, using 9.49MB memory