我在查找如何关闭连接时遇到问题WebClient
.我创建一个新WebClient
对象,然后DownloadFile
多次调用方法,但是,它总是为每个调用创建一个新连接,并且这些连接保持打开状态(已建立状态),我可以在TCPView中看到所有已建立的连接.
如果当我处理它时它会更加困扰我Webclient
,它们会保持建立......?如何在下载完成后强制关闭连接?
我已经尝试派生WebClient并将keep alive手动设置为false,我的app配置也允许足够的连接.
Dave R... 21
简短回答:您不需要手动关闭连接.他们在幕后为您管理.
请求完成后,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; } }
我也总是建议使用使用模式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{ "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头
简短回答:您不需要手动关闭连接.他们在幕后为您管理.
请求完成后,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; } }
我也总是建议使用使用模式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{ "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头