如何为WebClient.DownloadFileAsync捕获404 WebException

这段代码:

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块不会触发。

您需要处理DownloadFileCompleted事件并检查AsyncCompletedEventArgs的Error属性。

链接中有很好的例子。

你可以试试这段代码:

 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; }