http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4240|回复: 7

[例子] 连续请求不带Keep-Alive的解决方案

[复制链接]
发表于 2018-11-23 10:39:58 | 显示全部楼层 |阅读模式
当连续请求同一网址时会出现请求头里没有Connection=Keep-Alive这个。可以通过以下反射调用内部函数进行解决

      Private Sub SetHeaderValue(ByVal header As WebHeaderCollection, ByVal name As String, ByVal value As String)
            Dim [property] = GetType(WebHeaderCollection).GetProperty("InnerCollection", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
            If [property] IsNot Nothing Then
                Dim collection As NameValueCollection = [property].GetValue(header, Nothing)
                collection(name) = value
            End If
       End Sub



      If item.KeepAlive Then
                SetHeaderValue(request.Headers, "Connection", "Keep-Alive")
       Else
                request.KeepAlive = item.KeepAlive
       End If

vb.net代码,要c#的可以自行转换后添加上去。不知道有没有人有其他方式可以解决这个问题。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2018-11-23 15:29:25 | 显示全部楼层
本身就有这个参数吧在c#里面,
 楼主| 发表于 2018-11-24 00:58:53 | 显示全部楼层
httpWebRequest.ServicePoint.GetType().GetProperty("HttpBehaviour", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(httpWebRequest.ServicePoint, (byte)0, null)更改一下,在setrequest里加上这一句,httpWebRequest替换成对应的request实例。这个解决方案会更好一点,上面这个第一次请求时会出现2个keep-live值 。这个就完美解决了。
 楼主| 发表于 2018-11-24 01:02:11 | 显示全部楼层
站长苏飞 发表于 2018-11-23 15:29
本身就有这个参数吧在c#里面,

这个参数里有,但设置为true后,短时连续请求2次以上,第二个协议将不会出现keep-live这个header.

net 命名空间里
public string Connection
{
        get
        {
                return _HttpRequestHeaders["Connection"];
        }
        set
        {
                if (ValidationHelper.IsBlankString(value))
                {
                        _HttpRequestHeaders.RemoveInternal("Connection");
                }
                else
                {
                        string text = value.ToLower(CultureInfo.InvariantCulture);
                        bool flag = text.IndexOf("keep-alive") != -1;
                        bool flag2 = text.IndexOf("close") != -1;
                        if (flag | flag2)
                        {
                                throw new ArgumentException(SR.GetString("net_connarg"), "value");
                        }
                        _HttpRequestHeaders.CheckUpdate("Connection", value);
                }
        }
}
找了他的相关代码好像这一步会把他移除掉。
 楼主| 发表于 2018-11-24 01:03:18 | 显示全部楼层
我出现 这个问题是在使用同一个实例进行多次请求时出现 的,其他情况暂时没有测试
发表于 2018-11-24 10:18:50 | 显示全部楼层
果然是高手
发表于 2018-11-26 09:03:10 | 显示全部楼层
学习了, 正在研究中
发表于 2019-1-14 00:01:21 | 显示全部楼层
也遇到过这个问题 谢谢楼主
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-19 07:57

© 2014-2021

快速回复 返回顶部 返回列表