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

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对象,这个时候,就可以继续下去了,不会再出现远程主机强迫关闭的情况了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文盲老顾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值