Frage

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

Dabei sollte response.Close () aufgerufen werden?

  • nach jedem GetResponse () in try?

  • Nach dem letzten GetResponse () in Versuch - einmal?

  • in schließlich blockieren?
War es hilfreich?

Lösung

Keine der oben Genannten. Sie sollten einen using Block werden:

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

Ein using Block wird sichergestellt, dass die Dispose-Methode aufgerufen wird, ob es eine Ausnahme. Entsorgen Sie das gleiche wie Close tun.

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

entspricht:

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

Andere Tipps

Legen Sie es in dem finally-Block. Wie pro MSDN :

  

Der finally-Block ist nützlich für   Reinigung alle zugeordneten Ressourcen in   der try-Block als Lauf sowie jede   Code, selbst wenn es ausführen müssen   eine Ausnahme ist. Kontrolle ist immer   geben blockieren, um die schließlich unabhängig   wie der try-Block beendet wird.

Beachten Sie, dass verschachtelte Verwendung von Blöcken nicht geschweiften Klammern müssen, die Verbesserung der Lesbarkeit. So Code John Saunder geschrieben werden:

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 versteht, dass eine solche verschachtelte Blöcke tun Einrücken nicht benötigen. Hinweis btw, dass, wenn Sie die Codierung der Antwort wissen oder werden es sowieso ignorieren, WebClient eine einfachere API - fehlende Header-Informationen, so Kopfbasis (Übertragung / Text) kodiert Erkennung unmöglich wird, aber ansonsten funktioniert es gut.

Ich würde die vorschlagen unten

        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
        {
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top