无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接,并不是真的关闭连接,而是数据读取问题

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 btl = new List();
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,并转成Stream对象,这个时候,就可以继续下去了,不会再出现远程主机强迫关闭的情况了

你可能感兴趣的:(.net,c#,采集,远程主机强迫关闭)