HttpClient的SendAsync非常慢(不是代理问题)

时间:2016-09-26 02:11:33

标签: c# .net dotnet-httpclient

目前,使用HttpClient发送POST消息大约需要600毫秒。这似乎要比它应该的长得多,因为发送一个相同的POST与我编写的C程序以便测试(使用一个简单的套接字)表现得更好,大约37ms用于相同的操作和更多的代码。

sw.Start();
HttpResponseMessage result = client.SendAsync(request).Result;
sw.Stop();

这是我的测量方法。我知道我可以使用异步函数,并等待而不是使用任务Result,但是在这种情况下没有什么可担心“阻塞”,并且使用await / async会因为发送和接收消息而没有更快将花费相同的时间异步。至少,这是我的理解。

以下是在函数中使用它的示例:

    public void makeAttempt(string attempt)
    {
        Stopwatch sw = new Stopwatch();

        using (var request = new HttpRequestMessage() { Method = HttpMethod.Post })
        {
            request.RequestUri = new Uri("https://example.com/page?1");

            request.Content = new StringContent("attempt-" + trys.ToString(), Encoding.UTF8, "application/x-www-form-urlencoded");
            sw.Start();
            HttpResponseMessage result = client.SendAsync(request).Result;
            sw.Stop();
        }

        Console.WriteLine("Request took: " + sw.ElapsedMilliseconds.ToString() + "ms");
        trys++;
    }

最初我也有HttpClient& HttpClientHandler在同一语句中使用块,但是我读到HttpClient意味着要在多个请求上重用,所以我将它们移动到全局范围并在构造函数中初始化它们,如下所示:

HttpClient client;
HttpClientHandler handler;

    public Test(CookieContainer jar, WebHeaderCollection heads)
    {
        cookieJar = jar;
        headers = heads;
        handler = new HttpClientHandler() { CookieContainer = cookieJar, AllowAutoRedirect = true, Proxy = null, UseProxy = false };
        client = new HttpClient(handler);
        client.BaseAddress = new Uri("https://example.com/");
        client.DefaultRequestHeaders.ExpectContinue = false;
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0");
    }

有谁知道这可能是什么原因,或者如何提高此操作的性能?提前谢谢你,并会让每个人都了解我所学到的一切!干杯!

1 个答案:

答案 0 :(得分:0)

我将.NET Core 2.1 SocketsHttpHandler反向移植到.NET Framework,并且在某些情况下,与.NET Framework HttpClientHandler相比,我发现backported implementation的性能有了显着提高,特别是当同时发出多个请求时。 / p>