目前我有一个从服务器下载文件的非常简单的代码,但是我仍然遇到以下例外情况:
远程服务器返回错误:(500)
无法连接到远程服务器
与我的服务有关的网络服务器没有任何问题,我猜它会超时,我怎样才能更有效地处理这些问题呢?我的代码如下所示,非常简单。
try
{
string[] splitCrawlerid = StaticStringClass.crawlerID.Split('t');
WebClient webClient = new WebClient();
if (Directory.Exists("C:\\ImageDepot\\" + splitCrawlerid[2]))
{
}
else
{
Directory.CreateDirectory("C:\\ImageDepot\\" + splitCrawlerid[2]);
}
webClient.DownloadFile(privateHTML, @"C:\ImageDepot\" + splitCrawlerid[2] + "\\" + "AT" + carID + ".jpeg");
}
catch (Exception ex)
{
//not sure how to really handle these two exceptions reliably
}
对我来说理想的情况是尝试再次下载文件。
答案 0 :(得分:2)
尝试设置user-agent header。 WebClient不发送默认值,如果未设置用户代理,MSDN会警告某些Web服务器将返回500错误。
默认情况下,WebClient实例不会发送可选的HTTP标头。 如果您的请求需要可选标头,则必须添加标头 到Headers系列。例如,保留查询 响应,您必须添加用户代理标头。此外,服务器可能会返回 如果缺少用户代理标头,则为500(内部服务器错误)。
请参阅MSDN页面上的示例,了解如何添加标题。
答案 1 :(得分:0)
你可以把整个东西包裹在一个0到3的for循环中,webClient.DownloadFile(...)
之后的一行可以是break;
。这样,如果出现异常,则跳过break
,应用再次尝试。但这似乎更像是对我的创可贴;我会花更多的时间弄清楚出现问题的确切原因。
如果您要删除应用程序业务逻辑中的所有“尝试其他问题,直到重新抛出任何代码”,您可以定义一个类似
的扩展方法public static T TryNTimes<T>(this Func<T> func, int n) {
while (true) {
try {
return func();
} catch {
if (++i == n) throw;
}
}
}
并像
一样使用它Func<File> downloader = () => client.DownloadFile(...);
var file = downloader.TryNTimes(5);