Ответ 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);
}
}
}
Здесь еще один вопрос о том же вопросе: