此代码:
try
{
_wcl.DownloadFile(url, currentFileName);
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
if ((ex.Response as HttpWebResponse).StatusCode == HttpStatusCode.NotFound)
Console.WriteLine("\r{0} not found. ", currentFileName);
}
下载文件并通知是否发生404错误。
我决定异步下载文件:
try
{
_wcl.DownloadFileAsync(new Uri(url), currentFileName);
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
if ((ex.Response as HttpWebResponse).StatusCode == HttpStatusCode.NotFound)
Console.WriteLine("\r{0} not found. ", currentFileName);
}
现在,如果服务器返回404错误并且WebClient生成一个空文件,则不会触发此catch块。
答案 0 :(得分:6)
您需要处理DownloadFileCompleted事件并检查AsyncCompletedEventArgs的Error
属性。
链接中有很好的例子。
答案 1 :(得分:3)
您可以尝试以下代码:
WebClient wcl;
void Test()
{
Uri sUri = new Uri("http://google.com/unknown/folder");
wcl = new WebClient();
wcl.OpenReadCompleted += onOpenReadCompleted;
wcl.OpenReadAsync(sUri);
}
void onOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
if (e.Error != null)
{
HttpStatusCode httpStatusCode = GetHttpStatusCode(e.Error);
if (httpStatusCode == HttpStatusCode.NotFound)
{
// 404 found
}
}
else if (!e.Cancelled)
{
// Downloaded OK
}
}
HttpStatusCode GetHttpStatusCode(System.Exception err)
{
if (err is WebException)
{
WebException we = (WebException)err;
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
}
return 0;
}