通常,人们编写这样的代码来使用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/

    10-13 08:57