Quando ligar para WebSponse.close ()
-
19-09-2019 - |
Pergunta
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
{
}
onde deve responder.close () ser chamado?
Depois de cada getResponse () em tentativa?
Após o último getResponse () em tentativa - uma vez?
- em finalmente bloco?
Solução
Nenhuma das acima. Você deveria estar usando um using
quadra:
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
}
}
}
UMA using
O bloco garantirá que o método de disposição seja chamado, independentemente de haver ou não uma exceção. O Dispone fará a mesma coisa que perto.
using (var d = new DisposableClass()){code;}
é equivalente a:
DisposableClass d = null;
try
{
d = new DisposableClass();
code;
}
finally
{
if (d != null)
((IDisposable)d).Dispose();
}
Outras dicas
Coloque no bloco finalmente. Conforme Msdn:
O bloco finalmente é útil para limpar quaisquer recursos alocados no bloco de tentativas, além de executar qualquer código que deve ser executado, mesmo que haja uma exceção. O controle é sempre passado para o bloco finalmente, independentemente de como o bloco de tentativa sai.
Observe que o aninhado usando blocos não precisa de aparelhos encaracolados, melhorando a legibilidade. Para que o código de John Saunder possa ser escrito:
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
}
O vs.Net entende que esses blocos aninhados não precisam de recuo. Observe que, se você souber a codificação da resposta ou irá ignorá -la de qualquer maneira, o WebClient fornece uma API mais simples - as informações ausentes do cabeçalho, portanto, a detecção de codificação baseada em cabeçalho (transferência/texto) se torna impossível, mas, caso contrário, funciona bem.
Eu sugeriria o abaixo
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
{
}