12

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

如果当我处理 . 时,它们仍然保持不变,还有什么让我更加烦恼Webclient...?下载完成后如何强制关闭连接?

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

<connectionManagement>
  <add address="*" maxconnection="1000"/>
</connectionManagement>
4

1 回答 1

22

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

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 标头

于 2013-05-11T22:06:51.797 回答