WebClient DownloadFile返回错误500,但文件存在

时间:2016-05-12 07:27:21

标签: c# webclient webclient-download

我正在开发一个下载文件的网络服务。在输入时,我有一个文件列表,带有他们的网址。当我将网址放在我的浏览器上时,我可以下载该文件。

所以我管理我的服务以下载特定路径上的所有文件。这个工作就像一个魅力,但有时,服务器返回'错误500'

  

System.Net.WebException:操作已超时      在System.Net.WebClient.OpenRead(Uri地址)

  

System.Net.WebException:操作已超时      在System.Net.WebClient.DownloadFile(Uri地址,字符串fileName)

。我无法访问此服务器,因此无法修改代码。

这是我的代码

public static string DownloadFile(string url, string path)
    {
        string fileName = null;

        int nbTry = 10;

        for (int i = 0; i < nbTry; i++)
        {
            try
            {
                //Use WebDownload class and set timet for 10 seconds
                using (WebDownload client = new WebDownload(10000))
                {
                    client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)");
                    //Englobe with try catch in order to manage Error 500 when looping on download method

                    client.OpenRead(url);

                    string header_contentDisposition = client.ResponseHeaders["content-disposition"];
                    string filename = new ContentDisposition(header_contentDisposition).FileName;

                    Directory.CreateDirectory(path);
                    //Start the download and copy the file to the destinationFolder
                    client.DownloadFile(new Uri(url), path + @"\" + filename);
                    //If it's good, stop the loop
                    i = nbTry;
                    fileName = filename;
                }
            }
            catch (Exception e)
            {
                ILog logError = LogManager.GetLogger("error");
                logError.Error("Error in DownloadFile", e);
                logError.Error("Url : " + url + " Path : " + path);
                System.Threading.Thread.Sleep(50);
            }
        }
        return fileName;
    }

为了管理WebClient上的超时,我创建了WebDownload类

public class WebDownload : WebClient
{
    public int TimeOut { get; set; }

    public WebDownload() : this(60000) { }

    public WebDownload(int timeout)
    {
        this.TimeOut = timeout;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if(request != null)
        {
            request.Timeout = this.TimeOut;
        }
        return request;
    }
}

我的问题是管理此错误500并再次尝试在短时间内下载文件。当它失败时,我实际上被卡住了200秒。我可以有100个文件,所以我不能浪费2万个来下载这个文件。

欢迎任何建议,帮助,想法。

0 个答案:

没有答案