怎样保持http连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样保持http连接相关的知识,希望对你有一定的参考价值。

参考技术A http 无连接的,你要保持,必须要采用cookie,session等技术。追问

我不太懂这里。如果我用java写,需要实现这些吗?

追答

java有这种东西,不需要你自己写,你用一下就可以的。session在服务端用。cookie在客户端。具体的用法你可以百度。

连接保持活动在某些主机上无法与 System.Net.Http.HttpClient 一起使用

【中文标题】连接保持活动在某些主机上无法与 System.Net.Http.HttpClient 一起使用【英文标题】:Connection keep-alive not working with System.Net.Http.HttpClient on certain hosts 【发布时间】:2013-07-27 05:52:30 【问题描述】:

我正在使用 .NET System.Net.Http.HttpClient 试验 Heroku API。特别是,我希望keep-alive 能够工作,这样我就可以使用一个 TCP 连接发送多个 HTTP 请求,并且只进行一次 SSL 握手,而不是为每个请求设置一个带有 SSL 握手的 TCP 连接。

我正在测试https://api.heroku.com/status,它提供了一个不错的 HTTP 200,并使用 Wireshark 来监控 TCP 流量。

Google Chrome、ApacheBench(带有-k 标志)和 curl 似乎都能够保持 TCP 连接打开并发送多个请求。 HttpClient,没那么多。我还针对其他主机测试了 HttpClient(例如https://google.com/,在那里我只看到一个 SSL 握手/TCP 设置。所以看起来 HttpClient 和 Heroku API 之间的交互很糟糕。

这是我正在测试的代码:

private static async void TestUrl(string url)

    using (var client = GetClient())
    
        await client.GetAsync(url);
        await client.GetAsync(url);
        await client.GetAsync(url);
        await client.GetAsync(url);
    


private static HttpClient GetClient()

    var requestHandler = new HttpClientHandler
    
        UseCookies = false,
        AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
    ;

    return new HttpClient(requestHandler);

我还附上了一个 Wireshark 屏幕截图,显示了 HttpClient 在完成接收数据后如何决定重置 (RST) 连接。

对这里发生的事情有什么建议吗?

【问题讨论】:

Fiddler 显示了什么?如果他们协商 HTTP 1.0,那么您需要一个明确的 Keep-Alive 标头。 @StephenCleary Google Chrome 显示 HTTP/1.1 我的意思是在 HttpClient 和 Heroku 之间。 @StephenCleary 在调试和检查东西时,我从 HttpClient 中得到的 HttpResponseMessage 显示 Version: 1.1,所以我假设没问题。我还用 Fiddler2 进行了测试——它是 HTTP 1.1,Connection: keep-alive 发送正常。 【参考方案1】:

使用 WebRequestHandler 类而不是 HttpClientHandler 并将属性 HttpWebRequest.UnsafeAuthenticatedConnectionSharing 设置为 True。

【讨论】:

【参考方案2】:

一些代理服务器在进行身份验证时会忽略保持活动状态。如果我没记错的话,那是代理服务器使用 NTLM 身份验证的时候。

过去,我不得不添加一个部分类来“帮助”一些 Web 服务代理类。

我用

覆盖了 GetWebRequest(Uri uri) 方法
System.Net.HttpWebRequest webRequest = 
        (System.Net.HttpWebRequest)base.GetWebRequest(uri);
webRequest.ProtocolVersion = HttpVersion.Veraion10;  // I know this is strange, but it works
webRequest.ServicePoint.Expect100Continue = false;  // This is where the magic lives
return webRequest;

【讨论】:

以上是关于怎样保持http连接的主要内容,如果未能解决你的问题,请参考以下文章

怎样让ssh连接保持连接, 而不会因为没有操作而中断

HTTP接口长连接 跑脚本的时候 连接数一直在增加 导致后面的业务都超时了 这是脚本的原因 还是怎样?

Apache保持连接

HttpClient连接池的连接保持超时和失效机制

HttpClient连接池的连接保持超时和失效机制

进行 HTTP 隧道时如何保持连接打开