【问题标题】:Exception when downloading file using webclient (c#)使用 webclient (c#) 下载文件时出现异常
【发布时间】:2018-03-23 21:25:27
【问题描述】:

我正在使用 c# 代码从网站下载文件。我正在使用 webclient 类:

using (var client = new WebClient())
{                    
    client.DownloadFile(
        @"http://www.cftc.gov/files/dea/history/com_disagg_txt_2018.zip",
        @"destination"
     );
}

代码运行了好几个星期。但它在大约一周前停止工作。每当我运行代码时,它都会抛出一个异常:

现有连接已被远程主机关闭。 (错误代码10054)

我在想也许网站开始只允许通过浏览器下载所以我补充说:

client.Headers["User-Agent"] ="Mozilla/5.0 (Windows NT 6.3; rv:36.0) 
Gecko/20100101 Firefox/36.0";

但是,它并没有解决问题。

有人知道解决办法吗?

【问题讨论】:

  • 打开浏览器的开发者窗口,查看发送的内容,并将这些标题一一添加到您的代码中
  • 你查看过这个帖子:stackoverflow.com/questions/2582036/… 吗?底部有一条关于 webClient.Download() 存在问题的评论,并通过 .Net 框架更新解决了它。

标签: c# webclient


【解决方案1】:

这种故障很常见。
该站点已实施 TLS 1.2 协议。

协议切换到Https:,即使您在 你的 URI。

您只需启用它,因为 .Net ServicePointManager(仍然)默认为 Ssl3/Tls 1.0

使用以下代码对其进行测试:

string Url ="http://www.cftc.gov/files/dea/history/com_disagg_txt_2018.zip";

Uri URI = new Uri(Url, UriKind.Absolute);
WebClient_DownLoad(URI, FileName);


public void WebClient_DownLoad(Uri URI, string FileName)
{
    using (WebClient webclient = new WebClient())
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

        webclient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.BypassCache);
        webclient.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");
        webclient.Headers.Add(HttpRequestHeader.Accept, "ext/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        webclient.Headers.Add(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8");
        webclient.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate;q=0.8");
        webclient.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
        webclient.Headers.Add(HttpRequestHeader.KeepAlive, "keep-alive");
        webclient.UseDefaultCredentials = true;

        webclient.DownloadFileCompleted += new AsyncCompletedEventHandler(WebClient_DownloadComplete);
        webclient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(WebClient_DownloadProgress);

        webclient.DownloadFileAsync(URI, FileName);
    };
}

private void WebClient_DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
{
    string Result = string.Format("Received: {0}  Total: {1}  Percentage: {2}", 
                         e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage);
    //Update the UI
    Console.WriteLine(Result);
}

private static void WebClient_DownloadComplete(object sender, AsyncCompletedEventArgs e)
{
    if (!e.Cancelled)
    {
        if (e.Error != null)
            // Update the UI: transfer completed.
            Console.WriteLine("Error: " + e.Error.Message);

    }else{
        // Update the UI: transfer Cancelled.
        Console.WriteLine("Cancelled");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多