HttpWebRequest http = (HttpWebRequest)WebRequest.Create(full_url);
HttpWebResponse hwr = (HttpWebResponse)http.GetResponse();
Stream s = hwr.GetResponseStream();
MemoryStream ms = new MemoryStream();
s.CopyTo(ms);
byte[] bt = ms.ToArray();
string html = System.Text.Encoding.UTF8.GetString(bt);
以上是最简约的c#采集代码,但是,最近采集一些站点内容时,发现经常有提示“无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接”,而且也不是每次都这样,这就很奇怪了啊
我相信既然能正常采集一次,那么在没有触发防采集机制之前,且采集目标没有崩溃的情况下,不应该有其它应答出现,比如这个远程主机强迫关闭连接
而这个错误通过跟踪,可以看到,是出现在s.CopyTo(ms)时发生的,那么,Stream s = hwr.GetResponseStream()是获取成功的
那么,我们换一个写法,不用CopyTo这个方法了,用最笨的办法,直接对s进行ReadByte好了
HttpWebRequest http = (HttpWebRequest)WebRequest.Create(full_url);
HttpWebResponse hwr = (HttpWebResponse)http.GetResponse();
Stream grs = hwr.GetResponseStream();
List<byte> btl = new List<byte>();
while (true)
{
int nb = grs.ReadByte();
if (nb == -1)
{
break;
}else
{
btl.Add((byte)nb);
}
}
Stream s = new MemoryStream(btl.ToArray());
MemoryStream ms = new MemoryStream();
s.CopyTo(ms);
byte[] bt = ms.ToArray();
string html = System.Text.Encoding.UTF8.GetString(bt);
通过ReadByte,生成一个List<byte>,并转成Stream对象,这个时候,就可以继续下去了,不会再出现远程主机强迫关闭的情况了