solucionar soluciona solucion significa que problema not meme found error cómo como c# webclient

c# - soluciona - ¿Cómo verifico una solicitud de cliente web para un error 404?



¿cómo se soluciona el error 404? (8)

Importante: en una falla 404, DownloadFileTaskAsync lanzará una excepción pero TAMBIÉN creará un archivo vacío. Esto puede ser confuso por decir lo menos!

Me tomó demasiado tiempo darme cuenta de que este código crea un archivo vacío además de lanzar una excepción:

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

En su lugar, cambié a esto ( DownloadDataTaskAsync lugar de File ):

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

* No estoy seguro de un comportamiento de 500, pero seguro que un 404 hace esto.

Tengo un programa que estoy escribiendo que se descarga en archivos. El segundo archivo no es obligatorio y solo se incluye algunas veces. Cuando el segundo archivo no está incluido, devolverá un error HTTP 404 .

Ahora, el problema es que cuando se devuelve este error, finaliza todo el programa. Lo que quiero es continuar el programa e ignorar el error HTTP. Entonces, mi pregunta es ¿cómo detecto un error HTTP 404 de una solicitud WebClient.DownloadFile ?

Este es el código utilizado actualmente:

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


¡Use un bloque try {} catch {} con la WebException dentro de su bucle! No sé qué IDE está utilizando, pero con Visual Studio puede obtener mucha información sobre la excepción :)


Como otra escritura, como try-catch sería suficiente.

Otro consejo es usar HTTP HEAD para verificar si hay algo allí (es más ligero que hacer un HTTP GET completo):

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


Ponga la catch try dentro de su bucle 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. } }

Función privada para descargar el archivo.

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

Puede comprobar el WebException para el estado. Dependiendo del código de error puede continuar o romper.

Leer más @ MSDN

Sugerencia

Espero que esto funcione para usted.


Si específicamente quieres atrapar el error 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 } } }


puede probar este código para obtener el código de estado HTTP de WebException o 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; }


use una excepción web try catch en su código, examine el mensaje de excepción que contendrá el código de estado http.

Puede borrar la excepción y continuar.


WebClient lanzará una WebException para todas las respuestas 4xx y 5xx.

try { downloader.DownloadFile(videoAddress, videoPath); } catch (WebException ex) { // handle it here }