问题
This code:
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);
}
downloads file and informs if 404 error occured.
I decided to download files asynchronously:
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);
}
Now this catch block does not fire if server returns a 404 error and WebClient produces an empty file.
回答1:
You need to handle the DownloadFileCompleted event and check the Error
property of the AsyncCompletedEventArgs.
There are good examples in the links.
回答2:
You can try this code:
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;
}
来源:https://stackoverflow.com/questions/16387904/how-to-catch-404-webexception-for-webclient-downloadfileasync