当前位置:  开发笔记 > 编程语言 > 正文

WebClient每次下载文件时都会打开一个新连接,并且所有这些连接都已建立

如何解决《WebClient每次下载文件时都会打开一个新连接,并且所有这些连接都已建立》经验,为你挑选了1个好方法。

我在查找如何关闭连接时遇到问题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头



1> Dave R...:

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

请求完成后,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头

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有