通常,人们编写这样的代码来使用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对象?
MSDN文档中针对WebException.Response给出的示例完全不够用。
最佳答案
我快速浏览了Reflector,现在可以说:
WebResponse
是一个抽象类,将其所有关闭/处理行为委托(delegate)给其派生类。 HttpWebResponse
是您几乎可以肯定地在此处使用的派生类,在其close/dispose方法中,仅关注于布置实际的响应流。其余的类(Class)状态可以留给地方法院的温柔对待。 因此,只要您愿意执行关于异常处理的任何操作,就可能是安全的:
WebResponse
块中的try
读取响应流时,请将其封装在using
块中。 WebException
块中的catch
读取响应流,则也将其封装在using
块中。 WebException
本身的处理。 关于c# - 如何正确处置WebResponse实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1887314/