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?
Foi útil?

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
        {
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top