在为(404)File Not Found抛出异常之前,有没有办法处理HttpWebResponse.GetResponse()
?
我需要下载大量图片,使用Try..catch处理未找到的文件异常会使性能非常差。
private bool Download(string url, string destination)
{
try
{
if (RemoteFileExists("http://www.example.com/FileNotFound.png")
{
WebClient downloader = new WebClient();
downloader.DownloadFile(url, destination);
return true;
}
}
catch(WebException webEx)
{
}
return false;
}
private bool RemoteFileExists(string url)
{
try
{
//Creating the HttpWebRequest
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//Setting the Request method HEAD, you can also use GET too.
request.Method = "HEAD";
//Getting the Web Response.
//Here is my question, When the image's not there,
//the following line will throw an exception, How to avoid that?
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//Returns TURE if the Status code == 200
return (response.StatusCode == HttpStatusCode.OK);
}
catch
{
//Any exception will returns false.
return false;
}
}
答案 0 :(得分:1)
您可以使用HttpClient,它不会在404上抛出异常:
HttpClient c = new HttpClient();
var resp = await c.SendAsync(new HttpRequestMessage(HttpMethod.Head, "http://www.google.com/abcde"));
bool ok = resp.StatusCode == HttpStatusCode.OK;
答案 1 :(得分:0)
通过发送HttpClient
请求使用Async
将解决(404文件未找到)的异常,因此我会将其视为此问题的答案,但是,我想分享一下这里的性能测试。我已经测试了以下两种方法来下载50,000张图片:
方法1
try
{
// I will not check at all and let the the exception happens
downloader.DownloadFile(url, destination);
return true;
}
catch(WebException webEx)
{
}
方法2
try
{
// Using HttpClient to avoid the 404 exception
HttpClient c = new HttpClient();
var resp = await c.SendAsync(new HttpRequestMessage(HttpMethod.Head,
"http://www.example.com/img.jpg"));
if (resp.StatusCode == HttpStatusCode.OK)
{
downloader.DownloadFile(url, destination);
return true;
}
}
catch(WebException webEx)
{
}
在我的测试中,在下载的50.000张图像中没有144张图像,方法1中的性能比方法2快3倍。