2015-10-01 12 views
6

.NET WebExceptionをキャッチすると、Response.GetResponseStream()を閉じて処分する必要がありますか?WebException.Response.GetResponseStream()を閉じる/破棄する必要がありますか?

MSDN exampleは、例外で何も閉じたり処理したりしません。

多くの場合SOanswersは、レスポンスまたはストリームを廃棄することをお勧めします。

ストリームを配置したため、大きな問題が発生しました。 GetResponseStream()(常に?/時には?)は同じインスタンスを返します。だから私は、応答ストリームを取得し、それを処分すると、応答ストリームを取得した別のレイヤーに例外を再スローする可能性があります。

+0

[WebResponseインスタンスを正しく処分するにはどうすればいいですか?](https://stackoverflow.com/questions/1887314/how-to-properly-dispose-of-a-webresponse-instance) – Deantwo

答えて

2

リソースを保持している可能性があるので、そのストリームを破棄する必要があります。しかし、あなたがそれで終わったら、それを処分するだけです。ストリームが不要になる前に廃棄を中止するだけです。ストリームの最後のユーザーにそのストリームを破棄させます。

おそらく、GetResponseStream()に一度だけコールしてストリームを明示的に渡すと、ストリームが同じストリームであることがわかります。

+0

この情報のソースですか?これを示唆しているMSDNのものはありますか? '' GetResponseStream''に豊富な経験がありますか?それとも、おそらくそれがうまくいくかについての一般的な推測ですか?私の経験に基づいて、推測はこのAPIでうまくいきません。 – Peter

+0

反対の情報がない場合は、すべての使い捨てリソースを廃棄する必要があります。現在の実装ではそれが必要ではなくても(そして、私はそれがここに当てはまると言っているわけではない)、将来変更される可能性があります。したがって、コードの逆コンパイルは非常に信頼できる答えではありません。 GetResponseStreamはリソースを保持する可能性が非常に高いようです。あなたが処分をスキップしたい場合は、あなたは非常に確信している必要があります。 – usr

+0

あなたが間違っていると思われる場合、結果は致命的なものであることに注意してください。ランダムなリソースの枯渇、減速、または生産にハングアップします。負荷によってトリガされ、開発者テスト中に見つかりません(負荷がかかっていないため)。 – usr

5

あなたが所有しているオブジェクトIDisposableを処分することは良い練習ですが、それを処分する必要はありません。

実際、WebException.Responseまたはそれから返されたストリームを処理しようとすると、上の呼び出しチェーンの例外ハンドラでそのプロパティを読み取ろうとするコードが発生する可能性があるため、前述の問題が発生します。

​​を投げる前に、HttpWebRequestが内部でネットワークストリームからメモリストリームを作成し、内部のネットワークストリームが既に閉じられているためです。したがって、実際には、その時点で管理されていないリソースはありません。これは、例外を処理しやすくするための決定だったと思います。

残念ながら、MSDNのドキュメントにはこの動作についての説明がありません。技術的には実装が将来変更され、HttpWebResponseや関連ストリーム(WebException)を処理しないコードに問題が発生する可能性がありますが、多くのアプリケーションが現在の動作に依存する場合、この動作が実装を変更する可能性は非常に低いです。

あなたが所有しているオブジェクトIDisposableを処分することをお勧めしますが、追加する必要があります。可能であれば、代わりにHttpClientクラスを使用してください。そのため、このような状況にはまったく対処する必要はありません。できない場合はWebExceptionの処理を検討し、コードの発信者にWebExceptionを公開しない新しいタイプの例外を投げて、発信者が処分した後にWebException.Responseにアクセスしようとしている状況に遭遇しないようにします。

免責事項:私はMicrosoftで働いていますが、これは私の雇用主または.NET Frameworkチームの意見ではありません。保証は意味しません。

関連する問題