c# - 如何正确处理 WebResponse 实例?

标签 c# .net idisposable webresponse

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

相关文章:

c# - 以字符串格式对日期列表进行排序

c# - 拥有一次性字段的类型应该是一次性的。如何解决这个警告?

c# - 在 IDisposable 对象上使用语句 - 调用 Dispose 方法的延迟

c# - 延迟异步方法的最小起订量返回不延迟

c#: bin\debug 文件夹中的配置文件

c# - NUnit 测试中的 Lambda 和委托(delegate)类型 : compiler errors

c# - 将 for 循环转换为 linq 查询

c# - Travis-CI 构建失败 "The type or namespace name ' 扩展在命名空间中不存在”

.net - 如何创建带有左对齐选项卡的 TabControl 面板?

c# - NUnit 是否处理实现 IDisposable 的对象?