苏飞论坛

标题: 连续请求不带Keep-Alive的解决方案 [打印本页]

作者: Lockey    时间: 2018-11-23 10:39
标题: 连续请求不带Keep-Alive的解决方案
当连续请求同一网址时会出现请求头里没有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#的可以自行转换后添加上去。不知道有没有人有其他方式可以解决这个问题。

作者: 站长苏飞    时间: 2018-11-23 15:29
本身就有这个参数吧在c#里面,
作者: Lockey    时间: 2018-11-24 00:58
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值 。这个就完美解决了。
作者: Lockey    时间: 2018-11-24 01:02
站长苏飞 发表于 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);
                }
        }
}
找了他的相关代码好像这一步会把他移除掉。
作者: Lockey    时间: 2018-11-24 01:03
我出现 这个问题是在使用同一个实例进行多次请求时出现 的,其他情况暂时没有测试
作者: 站长苏飞    时间: 2018-11-24 10:18
果然是高手
作者: 范范    时间: 2018-11-26 09:03
学习了, 正在研究中
作者: pdang9980    时间: 2019-1-14 00:01
也遇到过这个问题 谢谢楼主




欢迎光临 苏飞论坛 (http://www.sufeinet.com/) Powered by Discuz! X3.4