Quand appeler WebResponse.Close ()
-
19-09-2019 - |
Question
WebResponse response;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
response = request.GetResponse();
request = (HttpWebRequest)WebRequest.Create(url2);
response = request.GetResponse();
}
catch(Exception ex)
{
//do something
}
finally
{
}
où doit response.Close () être appelé?
-
après chaque GetResponse () en essayer?
-
après la dernière GetResponse () à essayer - une fois?
- en bloc finally?
La solution
Aucune de ces. Vous devez utiliser un bloc using
:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
{
using (var stream = response.GetResponseStream())
{
using (var reader = new StreamReader(stream))
{
var result = reader.ReadToEnd();
// Do something with result
}
}
}
Un bloc de using
veillera à ce que la méthode Dispose est appelée, si oui ou non il y a une exception. Éliminer fera la même chose que Fermer.
using (var d = new DisposableClass()){code;}
est équivalent à:
DisposableClass d = null;
try
{
d = new DisposableClass();
code;
}
finally
{
if (d != null)
((IDisposable)d).Dispose();
}
Autres conseils
Le mettre dans le bloc finally. Comme par MSDN :
Le bloc finally est utile pour nettoyage des ressources allouées dans le bloc d'essai, ainsi que l'exécution d'une code qui doit exécuter même si est une exception. Le contrôle est toujours passé au bloc finally quel que soit de la façon dont les sorties du bloc try.
Notez que imbriqués en utilisant des blocs ne ont pas besoin d'accolades, d'améliorer la lisibilité. Ainsi, le code de John Saunder pourrait être écrit:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
var result = reader.ReadToEnd();
// Do something with result
}
VS.NET comprend que ces blocs imbriqués ne ont pas besoin indenter. Notez BTW que si vous connaissez le codage de la réponse ou allez ignorer toute façon, WebClient fournit une simple API - informations d'en-tête manquant, donc basée en-tête (transfert / texte) codant pour la détection devient impossible, mais sinon il fonctionne très bien.
Je suggère le ci-dessous
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
request.Timeout = 20000;
using (var response = request.GetResponse())
{
//Do something with response.
}
request = (HttpWebRequest)WebRequest.Create("http://www.bing.com");
using (var response = request.GetResponse())
{
//Do somehing with response
}
}
catch (Exception ex)
{
//do something
}
finally
{
}