質問

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
        {
        }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top