C#webClient.DownloadFile异常问题

时间:2011-08-22 00:34:14

标签: c#

目前我有一个从服务器下载文件的非常简单的代码,但是我仍然遇到以下例外情况:

远程服务器返回错误:(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
}

对我来说理想的情况是尝试再次下载文件。

2 个答案:

答案 0 :(得分:2)

尝试设置user-agent headerWebClient不发送默认值,如果未设置用户代理,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);