Как проверить запрос WebClient на ошибку 404
у меня есть программа, которую я пишу, которая загружает в файлы. Второй файл не neccassary и только несколько раз включал. Когда второй файл не будет включен, он вернет 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 ответов
используйте try catch webexception в коде проверьте сообщение об исключении, которое будет содержать код состояния http.
вы можете очистить исключение и продолжить.
Если вы конкретно хотите поймать ошибку 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
}
}
}
WebClient будет бросать WebException для всех ответов 4xx и 5xx.
try {
downloader.DownloadFile(videoAddress, videoPath);
}
catch (WebException ex) {
// handle it here
}
поставить 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
предложение
- использовать путь.Объединить создать папку.
- можно использовать строку.Формат для соединения двух строк вместо
+
.
надеюсь, это сработает для вас.
вы можете попробовать этот код, чтобы получить код состояния HTTP из WebException или OpenReadCompletedEventArgs.Ошибка:
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;
}
используйте блок try{} catch{} с WebException внутри вашего цикла ! Не знаю, что IDE u использует, но с Visual Studio u может получить много информации об исключении:)
как другие пишут, как 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();
}
важно: при сбое 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 делает это.