Использует ли WebClient KeepAlive?

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

Ответ 1

Он работает на моей машине, но я не вижу, чтобы это было документировано. Я бы, конечно, ожидал, что это будет по умолчанию. Самый простой способ - запустить 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, он предположил, что он останется таким.

Ответ 2

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

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

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