3

HttpWebRequestから応答を取得し(変更バージョンのJeff RichterのCCRラッパーを使用)、ダウンロードを続行するかどうかを決定するためにいくつかのヘッダーを調べています。続行したくない場合があるため、結果としてresponse.Closerequest.Abortを発行します。GetResponseStreamを発行してからストリームを閉じる必要がありますか、それともresponse.Closeを呼び出すときに暗黙的に行われますか?

GetResponseを発行した後、ドキュメントの状態は次のとおりです。

ストリームを閉じて接続を解放するには、Closeメソッドを呼び出す必要があります。そうしないと、アプリケーションの接続が不足する可能性があります。

つまり、応答があったら、ストリームを取得して閉じる必要があるということですか?

ハングしたダウンロードが最終的にシステムを圧倒するという、かなり奇妙な問題が発生しています。これはリソースリークの最有力候補のようですが、他の誰かがこの問題の経験があるかどうか疑問に思います。

余談ですが、同じストリームであると仮定して、GetResponseStreamを2回実行しても安全ですか?

4

3 に答える 3

6

HttpWebResponse.Closeを呼び出すと、応答ストリームが暗黙的に閉じられます。

ドキュメントから:

Closeメソッドは、応答ストリームを閉じ、他のリクエストで再利用できるようにリソースへの接続を解放します

Stream.CloseメソッドまたはHttpWebResponse.Closeメソッドのいずれかを呼び出して、ストリームを閉じ、接続を解放して再利用する必要があります。Stream.CloseとHttpWebResponse.Closeの両方を呼び出す必要はありませんが、呼び出すことでエラーが発生することはありません。ストリームを閉じないと、アプリケーションの接続が不足する可能性があります。

また、double-GetResponseStreamの質問については、ドキュメントに明示的に記載されていませんが、何度呼び出しても常に同じストリームオブジェクトが返されます。

于 2009-10-08T10:17:53.933 に答える
2

実際には、webResponse.Close()を呼び出すと、応答ストリームが閉じられます。

応答はIDisposableです。usingステートメントをお勧めします。

于 2009-10-08T10:21:47.313 に答える
0

WCF接続のようなことをする

//Done with the service, let's close it.
try
{
   if (client.State != System.ServiceModel.CommunicationState.Faulted)
   {
      client.Close();
   }
}
catch (Exception ex)
{
   client.Abort();
}
于 2011-05-25T07:00:59.270 に答える