通常,人们会编写类似这样的代码来使用 WebRequest 下载一些数据。
using(WebResponse resp = request.GetResponse()) // WebRequest request...
using(Stream str = resp.GetResponseStream())
; // do something with the stream str
现在,如果抛出 WebException,则 WebException 具有对 WebResponse 对象的引用,该对象可能会或可能不会调用 Dispose(取决于异常发生的位置,或响应类的实现方式)- 我不知道知道。
我的问题是应该如何处理这个问题。一个人应该非常防御地编码,并在 WebException 对象中处理响应(这有点奇怪,因为 WebException 不是 IDisposable)。或者应该忽略这一点,可能访问已处置的对象或从不处置 IDisposable 对象? WebException.Response 的 MSDN 文档中给出的示例完全不合适。
最佳答案
我快速浏览了 Reflector,现在可以说:
WebResponse
作为一个抽象类,将其所有关闭/处理行为委托(delegate)给其派生类。HttpWebResponse
是您几乎肯定会在此处使用的派生类,在其 close/dispose 方法中,它只关心处理实际的响应流。类状态的其余部分可以留给 GC 的怜悯。
由此可见,在异常处理方面随心所欲可能是安全的,只要:
- 当您在
try
block 中从WebResponse
读取响应流时,将其包含在using
block 中。 - 如果您在
catch
block 中从WebException
读取响应流,请将其包含在using
block 中 - 无需担心处理
WebException
本身。
关于c# - 如何正确处理 WebResponse 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1887314/