WebClient每次下载文件时都会打开一个新连接,并且所有文件都保持建立状态

我在查找如何关闭WebClient建立的连接时遇到问题。 我创建了一个新的WebClient对象,然后多次调用DownloadFile方法,但是,它总是为每个调用创建一个新连接,并且这些连接保持打开状态(已建立状态),我可以在TCPView中看到所有已建立的连接。

如果当我处理Webclient ,他们会保持建立…… 如何在下载完成后强制关闭连接?

我已经尝试派生WebClient并将keep alive手动设置为false,我的app配置也允许足够的连接。

    

简短回答:您不需要手动关闭连接。 他们在幕后为您管理。

请求完成后,HTTP / 1.1连接不会立即关闭,以便以更及时有效的方式处理对同一服务器的多个请求(例如,Web浏览器从单个站点请求多个文件)。 您不必担心这一点或手动关闭它们,因为它们会在一段时间后超时。 它导致错误吗?

如果是一个问题,您可以尝试inheritanceWebClient并重写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 } 

最后,这里有一些关于HTTP / 1.1中持久连接的RFC信息:

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

和更友好的维基百科条目:

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

编辑:

道歉。 我从你编辑的问题中看到你已经尝试过类似上面的内容,但没有成功。

但是,我无法重现您的问题。 根据TCPView,我使用NoKeepAlivesWebClient编写了一个小程序,它在使用后成功关闭了连接。

 static void Main(string[] args) { // Random test URLs var urls = new List { "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); } } } 

关于同样的问题还有另一个问题:

C#摆脱WebClient中的Connection头