简短的回答:您不需要手动关闭连接。他们在幕后为您管理。
HTTP/1.1 连接不会在请求完成后立即关闭,以便以更及时和有效的方式处理对同一服务器的多个请求(例如 Web 浏览器从单个站点请求多个文件)。您不必担心这一点或手动关闭它们,因为它们会在一段时间后超时。它会导致错误吗?
如果这是一个问题,您可以尝试继承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;
}
}
我也总是建议使用 using 模式WebClient
:
using (var client = new NoKeepAlivesWebClient())
{
// Some code
}
最后,这里有一些关于 HTTP/1.1 中持久连接的 RFC 信息:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html
和一个更友好的维基百科条目:
http://en.wikipedia.org/wiki/HTTP_persistent_connection
编辑:
道歉。我从您编辑的问题中看到,您已经尝试过类似上述的方法,但没有成功。
但是,我无法重现您的问题。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);
}
}
}
关于同一问题,这里还有另一个 SO 问题:
C# 去掉 WebClient 中的 Connection 标头