在为(404)File Not Found抛出异常之前处理HttpWebResponse

时间:2014-07-08 17:10:41

标签: c# asp.net download webclient httpwebresponse

在为(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;
    }
}

2 个答案:

答案 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倍。