Использует ли WebClient KeepAlive? - PullRequest
23 голосов
/ 15 января 2011

Мне нужно выдать около 50 HTTP-запросов на один хост (вызовы API).Производительность важна, поэтому я бы хотел использовать HTTP KeepAlive.WebClient поддерживает это?

Ответы [ 2 ]

20 голосов
/ 15 января 2011

Это происходит на моей машине, но я не вижу, что это задокументировано .Я бы, конечно, ожидал, что по умолчанию.Самый простой способ определить это - запустить Wireshark (или Fiddler) и посмотреть, что именно происходит по проводу.

Например, эта программа:

using System;
using System.Net;

class Test
{    
    static void Main()
    {
        WebClient client = new WebClient();
        for (int i = 0; i < 50; i++)
        {
            string text = client.DownloadString("http://www.microsoft.com");
            Console.WriteLine(text.Length);
        }
    }
}

Создает первый запрос:

GET / HTTP/1.1   
Host: www.microsoft.com    
Connection: Keep-Alive

Запросы подпоследовательности просто:

GET / HTTP/1.1
Host: www.microsoft.com

... предположительно, потому что, когда соединение находится в режиме KeepAlive, предполагается, что оно останется таким.

17 голосов
/ 15 января 2011

Как документировано здесь, WebClient использует WebRequest в своей частной реализации, http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx. Microsoft не предоставляет это как открытое свойство, которым вы можете управлять.

Поэтому, рассматривая его реализацию с помощью Reflector, вы можете увидеть, как KeepAlive устанавливается для используемого объекта WebRequest. Как указал @Jon, эксперимент показывает, что KeepAlive имеет значение true. Это также подходит для других сценариев, таких как частная реализация удаленного взаимодействия .NET.

В редких случаях вы можете обнаружить, что KeepAlive = true может привести к SocketException, а затем вам придется использовать отражение или другие приемы, чтобы установить для него значение false, что очень раздражает.

...