2010-10-12 9 views
2

J'utilise C# WebClient(); télécharger un fichier depuis un serveur. Le problème est quand je n'ai pas internet ou que le serveur n'est pas réactif, mon application se bloque en essayant de télécharger ce fichier. Quelle est la meilleure pratique pour éviter le plantage, pour annuler et donner une notification que la connexion avec un serveur a échoué?Comment éviter le plantage d'une application lors du téléchargement d'un fichier à l'aide de WebClient();

+0

Ne pouvez-vous pas simplement attraper l'exception? –

+0

Que voulez-vous dire des accidents? Y a-t-il une exception levée? –

Répondre

5

poignée seulement les exceptions renvoyées par WebClient.DownloadFile:

try 
{ 
    WebClient.DownloadFile(uri, myPath); 
} 
catch(WebException webEx) 
{ 
    // There was an exception due to network or path problems... 
    // Notify the user? 
} 
+0

À la votre! Merci pour le conseil, j'ai utilisé: if (ex.Status == WebExceptionStatus.ProtocolError) –

2

Un serveur ne répondant est une situation exceptionnelle qui est mieux traitée à l'utilisation appropriée sauf manipulation avec un bloc try/catch. L'exception à traiter pour la demande WebClient est un WebException Vous pouvez inspecter l'objet d'exception pour plus de détails. La propriété Status contiendra un status value qui vous donnera plus d'informations sur ce qui s'est vraiment mal passé.

Vérifiez la samples in MSDN:

try 
{ 
    WebClient client = new WebClient(); 

    byte[] pageData = client.DownloadData("http://www.contoso.com"); 
    string pageHtml = Encoding.ASCII.GetString(pageData); 
    Console.WriteLine(pageHtml); 

    client.DownloadFile("http://www.contoso.com", "page.htm"); 
} 
catch (WebException webEx) 
{ 
    Console.WriteLine(webEx.ToString()); 
    if(webEx.Status == WebExceptionStatus.ConnectFailure) 
    { 
     Console.WriteLine("Are you behind a firewall? If so, go through the proxy server."); 
    } 
} 
+0

Très bon message, merci de votre temps ... –

+0

@Badr Hari: De rien. Bonne chance pour votre projet. –

1

Si c'est interactif, alors oui ce serait la meilleure chose à faire lors de la capture de l'exception pertinente. Que vous avortiez tout ou que vous donniez un message (et que ce message soit modal ou non modal) dépendrait de votre interface utilisateur globale. Généralement, abandonner est plus acceptable dans la ligne de commande ou dans une application Web (avec une réponse appropriée pour chacun), abandonner juste cette opération avec un message d'erreur est plus approprié pour une application GUI. Si c'était quelque chose fonctionnant comme un service etc. vous voudriez enregistrer l'exception et passer à l'opération suivante, éventuellement avec un certain degré de back-off (deux exceptions dans une rangée, attendez un peu comme le le réseau est peut-être complètement éteint, une autre exception, attendez plus longtemps cette fois-ci). Dans les deux cas, vous devez explicitement attraper WebException s (et peut-être IOException de la tentative d'enregistrement du fichier défaillant) et laisser d'autres exceptions (qui sont plus susceptibles d'être dues à des bogues dans l'application) stratégie.