Как проверить запрос WebClient на ошибку 404 - PullRequest
18 голосов
/ 23 января 2012

У меня есть программа, которую я пишу, которая загружает в файлы. Второй файл не является обязательным и включен только несколько раз. Если второй файл не включен, он вернет ошибку HTTP 404.

Теперь проблема в том, что когда возвращается эта ошибка, она завершает всю программу. Я хочу продолжить программу и проигнорировать ошибку HTTP. Итак, мой вопрос, как я могу поймать ошибку HTTP 404 из запроса WebClient.DownloadFile?

Этот код используется в настоящее время ::

WebClient downloader = new WebClient();
foreach (string[] i in textList)
{
    String[] fileInfo = i;
    string videoName = fileInfo[0];
    string videoDesc = fileInfo[1];
    string videoAddress = fileInfo[2];
    string imgAddress = fileInfo[3];
    string source = fileInfo[5];
    string folder = folderBuilder(path, videoName);
    string infoFile = folder + '\\' + removeFileType(retrieveFileName(videoAddress)) + @".txt";
    string videoPath = folder + '\\' + retrieveFileName(videoAddress);
    string imgPath = folder + '\\' + retrieveFileName(imgAddress);
    System.IO.Directory.CreateDirectory(folder);
    buildInfo(videoName, videoDesc, source, infoFile);
    textBox1.Text = textBox1.Text + @"begining download of files for" + videoName;
    downloader.DownloadFile(videoAddress, videoPath);
    textBox1.Text = textBox1.Text + @"Complete video for" + videoName;
    downloader.DownloadFile(imgAddress, imgPath);
    textBox1.Text = textBox1.Text + @"Complete img for" + videoName;
}

Ответы [ 8 ]

17 голосов
/ 08 декабря 2013

Если вы определенно хотите отловить ошибку 404:

using (var client = new WebClient())
{
  try
  {
    client.DownloadFile(url, destination);
  }
  catch (WebException wex)
  {
    if (((HttpWebResponse) wex.Response).StatusCode == HttpStatusCode.NotFound)
    {
      // error 404, do what you need to do
    }
  }
}
12 голосов
/ 23 января 2012

WebClient выдает исключение WebException для всех ответов 4xx и 5xx.

try {
    downloader.DownloadFile(videoAddress, videoPath);
}
catch (WebException ex) {
    // handle it here
}
7 голосов
/ 23 января 2012

Поместите try catch в вашу foreach петлю.

 foreach (string[] i in textList)
 {
    try
    {
        String[] fileInfo = i;
        string videoName = fileInfo[0];
        string videoDesc = fileInfo[1];
        string videoAddress = fileInfo[2];
        string imgAddress = fileInfo[3];
        string source = fileInfo[5];
        string folder = folderBuilder(path, videoName);
        string infoFile = folder + '\\' + removeFileType(retrieveFileName(videoAddress)) + @".txt";
        string videoPath = folder + '\\' + retrieveFileName(videoAddress);
        string imgPath = folder + '\\' + retrieveFileName(imgAddress);
        System.IO.Directory.CreateDirectory(folder);
        buildInfo(videoName, videoDesc, source, infoFile);
        textBox1.Text = textBox1.Text + @"begining download of files for" + videoName;
        if(Download(videoAddress, videoPath) == false)
        {
           //Download failed. Do what you want to do.
        }
        textBox1.Text = textBox1.Text + @"Complete video for" + videoName;
        if(Download(imgAddress, imgPath)== false)
        {
           //Download failed. Do what you want to do.
        }
        textBox1.Text = textBox1.Text + @"Complete img for" + videoName;
    }
    catch(Exception ex)
    {
        //Error like IO Exceptions, Security Errors can be handle here. You can log it if you want.
    }
 }

Частная функция для загрузки файла

 private bool Download(string url, string destination)
 {
     try
     {
         WebClient downloader = new WebClient();
         downloader.DownloadFile(url, destination);
         return true;
     }
     catch(WebException webEx)
     {
        //Check (HttpWebResponse)webEx.Response).StatusCode
        // Or
        //Check for webEx.Status
     }
     return false;
 }

Вы можете проверить WebException на статус. В зависимости от кода ошибки вы можете продолжить или прервать.

Подробнее @ MSDN

Предложение

  • Используйте Path.Combine для создания пути к папке.
  • Может использовать String.Format для объединения двух строк вместо +.

Надеюсь, это работает для вас.

1 голос
/ 09 декабря 2014

вы можете попробовать этот код, чтобы получить код состояния HTTP из WebException или OpenReadCompletedEventArgs.Error:

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;
}
1 голос
/ 23 января 2012

используйте webexception try catch в вашем коде, изучите сообщение об исключении, которое будет содержать код состояния http.

Вы можете очистить исключение и продолжить.

0 голосов
/ 24 февраля 2018

Внимание! При ошибке 404 DownloadFileTaskAsync сгенерирует исключение, но ТАКЖЕ создаст пустой файл. Это может быть запутанным, мягко говоря!

Мне потребовалось слишком много времени, чтобы понять, что этот код создает пустой файл в дополнение к исключению:

await webClient.DownloadFileTaskAsync(new Uri("http://example.com/fake.jpg"), filename);

Вместо этого я переключился на это (DownloadDataTaskAsync вместо File):

 var data = await webClient.DownloadDataTaskAsync(new Uri("http://example.com/fake.jpg"));
 File.WriteAllBytes(filename, data);

* Я не уверен насчет 500 поведения, но наверняка 404 делает это.

0 голосов
/ 23 января 2012

Как и другие пишут, как try-catch хватило бы.

Другой совет - использовать HTTP HEAD , чтобы проверить, есть ли там что-нибудь (это легче, чем полный HTTP GET):

var url = "url to check;
var req = HttpWebRequest.Create(url);
req.Method = "HEAD"; //this is what makes it a "HEAD" request
WebResponse res = null;
try
{
    res = req.GetResponse();
    res.Close();
    return true;
}
catch
{
    return false;
}
finally
{
    if (res != null)
        res.Close();
}
0 голосов
/ 23 января 2012

Используйте блок try {} catch {} с WebException внутри вашего цикла!Не знаю, какую IDE вы используете, но с помощью Visual Studio вы можете получить много информации об исключении:)

...