我正在开发一个下载文件的网络服务。在输入时,我有一个文件列表,带有他们的网址。当我将网址放在我的浏览器上时,我可以下载该文件。
所以我管理我的服务以下载特定路径上的所有文件。这个工作就像一个魅力,但有时,服务器返回'错误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万个来下载这个文件。
欢迎任何建议,帮助,想法。