Подтвердить что ты не робот

WebClient открывает новое соединение каждый раз, когда я загружаю файл, и все они остаются установленными

У меня возникла проблема с выяснением того, как закрыть соединение, сделанное WebClient. Я создаю новый объект WebClient, а затем вызываю метод DownloadFile много раз, однако он всегда создает новое соединение для каждого вызова, и эти соединения остаются открытыми (состояние установленное), я вижу в TCPView все установленные соединения.

Что меня еще больше задевает, если я распоряжаюсь WebClient, они остаются установленными...? Как принудительно закрыть соединение после завершения загрузки?

Я уже пытался вывести WebClient и установить, чтобы поддерживать в реальном времени значение false, моя конфигурация приложения также позволяет достаточно подключений.

<connectionManagement>
  <add address="*" maxconnection="1000"/>
</connectionManagement>
4b9b3361

Ответ 1

Короткий ответ: вам не нужно закрывать соединения вручную. Они управляются для вас за кулисами.

Соединения HTTP/1.1 не закрываются, как только запрос завершается, чтобы несколько запросов на один и тот же сервер обрабатывались более своевременно и эффективно (например, веб-браузер, запрашивающий несколько файлов с одного сайта). Вам не стоит беспокоиться об этом или закрывать их вручную, так как они через некоторое время будут таймаутом. Это вызывает ошибку?

Если это проблема, вы можете попробовать наследовать от WebClient и переопределить метод GetWebRequest, чтобы вручную установить KeepAlive, например:

public class NoKeepAlivesWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request is HttpWebRequest)
        {
            ((HttpWebRequest)request).KeepAlive = false;
        }

        return request;
    }
}

Я также всегда предлагаю использовать шаблон использования для WebClient:

using (var client = new NoKeepAlivesWebClient())
{
    // Some code
}

Наконец, здесь некоторые RFC-данные о постоянных соединениях в HTTP/1.1:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

и более дружественная запись в Википедии:

http://en.wikipedia.org/wiki/HTTP_persistent_connection

Edit:

Извиняюсь. Я вижу из вашего отредактированного вопроса, что вы уже пробовали что-то вроде выше, без успеха.

Однако я не смог воспроизвести вашу проблему. Я написал небольшую программу с использованием NoKeepAlivesWebClient и успешно закрытых соединений после их использования в соответствии с TCPView.

static void Main(string[] args)
{
    // Random test URLs
    var urls = new List<string> {
        "http://msdn.microsoft.com/en-us/library/tt0f69eh.aspx",
        "http://msdn.microsoft.com/en-us/library/system.net.webclient.allowreadstreambuffering.aspx",
        "http://msdn.microsoft.com/en-us/library/system.net.webclient.allowwritestreambuffering.aspx",
        "http://msdn.microsoft.com/en-us/library/system.net.webclient.baseaddress.aspx",
        "http://msdn.microsoft.com/en-us/library/system.net.webclient.cachepolicy.aspx",
        "http://msdn.microsoft.com/en-us/library/system.net.webclient.credentials.aspx",
        "https://www.youtube.com/",
        "https://www.youtube.com/feed/UClTpDNIOtgfRkyT-AFGNWVw",
        "https://www.youtube.com/feed/UCj_UmpoD8Ph_EcyN_xEXrUQ",
        "https://www.youtube.com/channel/UCn-K7GIs62ENvdQe6ZZk9-w" };

    using (var client = new NoKeepAlivesWebClient())
    {
        // Save each URL to a Temp file
        foreach (var url in urls)
        {
            client.DownloadFile(new Uri(url), System.IO.Path.GetTempFileName());
            Console.WriteLine("Downloaded: " + url);
        }
    }
}

Здесь еще один вопрос о том же вопросе:

С# избавиться от заголовка Connection в WebClient