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?
Était-ce utile?

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
        {
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top