7

我正在使用 .NET 试验 Heroku API System.Net.Http.HttpClient。特别是,我想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 屏幕截图,显示 HttpClientRST在完成接收数据后如何决定重置()连接。

Wireshark 截图

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

4

2 回答 2

7

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

于 2014-01-21T20:56:30.830 回答
0

一些代理服务器在进行身份验证时会忽略保持活动状态。如果我没记错的话,那是代理服务器使用 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;
于 2013-08-09T07:12:20.097 回答