我在查找如何关闭连接时遇到问题WebClient
.我创建一个新WebClient
对象,然后DownloadFile
多次调用方法,但是,它总是为每个调用创建一个新连接,并且这些连接保持打开状态(已建立状态),我可以在TCPView中看到所有已建立的连接.
如果当我处理它时它会更加困扰我Webclient
,它们会保持建立......?如何在下载完成后强制关闭连接?
我已经尝试派生WebClient并将keep alive手动设置为false,我的app配置也允许足够的连接.
<connectionManagement>
<add address="*" maxconnection="1000"/>
</connectionManagement>
Run Code Online (Sandbox Code Playgroud)
Dav*_* 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我也总是建议使用使用模式WebClient
:
using (var client = new NoKeepAlivesWebClient())
{
// Some code
}
Run Code Online (Sandbox Code Playgroud)
最后,这里有一些关于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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
关于同样的问题,还有另一个问题:
归档时间: |
|
查看次数: |
17743 次 |
最近记录: |