Quando chiamare WebResponse.Close ()
-
19-09-2019 - |
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?
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
{
}