WebResponse.Close() を呼び出すタイミング
-
19-09-2019 - |
質問
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
{
}
どこでresponse.Close()を呼び出すべきでしょうか?
try のすべての GetResponse() の後?
最後の GetResponse() の試行の後 - 1 回?
- ついにブロックで?
解決
上記のなし。あなたは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
}
}
}
using
ブロックは例外があるか否か、Disposeメソッドが呼び出されることを保証します。クローズ同じことを行います廃棄ます。
using (var d = new DisposableClass()){code;}
に相当します
DisposableClass d = null;
try
{
d = new DisposableClass();
code;
}
finally
{
if (d != null)
((IDisposable)d).Dispose();
}
他のヒント
finallyブロックでそれを入れてください。
: MSDN のあたりとしてfinallyブロックは便利です に割り当てられたリソースをクリーンアップ tryブロックと同様にいずれかを実行しています たとえそこに実行する必要のあるコード 例外はあります。コントロールは常にあります 最終的には関係なく、ブロックに渡されます 方法をtryブロックを終了します。
ブロックを使用して、ネストした
注可読性を向上させること、中括弧を必要としません。だから、ジョンSaunderのコードを書くことができます:
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は、このようなネストされたブロックはインデントする必要はありませんことを理解しています。ヘッダー・ベース(転送/テキスト)エンコーディング検出が不可能になるので、不足しているヘッダ情報が、そうでない場合は正常に動作します - あなたはレスポンスのエンコーディングを知っているか、とにかくそれを無視しようとしている場合、Webクライアントは、シンプルなAPIを提供することところで注意してください。
私は以下のことをお勧めします。
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
{
}
所属していません StackOverflow