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