Domanda

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

dove dovrebbe response.Close () essere chiamato?

  • dopo ogni GetResponse () nel tentativo?

  • dopo l'ultima GetResponse () in prova - una volta?

  • nel blocco finally?
È stato utile?

Soluzione

Nessuno dei precedenti. Si deve usare un blocco 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 blocco using farà in modo che il metodo Dispose viene chiamato, se v'è un'eccezione. Smaltire farà la stessa cosa di chiudere.

using (var d = new DisposableClass()){code;}

è equivalente a:

DisposableClass d = null;
try
{
    d = new DisposableClass();
    code;
}
finally
{
    if (d != null)
        ((IDisposable)d).Dispose();
}

Altri suggerimenti

Metti nel blocco finally. Come da MSDN :

  

Il blocco finally è utile per   ripulire tutte le risorse assegnate nel   il blocco try, nonché l'esecuzione di qualsiasi   codice che deve eseguire, anche se non ci   è un'eccezione. Il controllo è sempre   passato al blocco finally indipendentemente   di come il blocco try.

Si noti che nidificate utilizzando i blocchi non hanno bisogno di parentesi graffe, migliorando la leggibilità. Quindi il codice di John Saunder potrebbe essere scritto:

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 capisce che tali blocchi annidati non hanno bisogno di rientro. Si noti btw che se si conosce la codifica della risposta o intenzione di ignorarlo in ogni caso, WebClient fornisce un'API più semplice - mancano informazioni di intestazione, in modo Header-base (trasferimento / testo) rilevazione codifica diventa impossibile, ma per il resto funziona bene.

Vorrei suggerire il seguente

        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
        {
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top