Pet*_*ter 7 .net c# idisposable httpwebresponse webexception
当我抓到.NET时WebException,我应该关闭/处理Response.GetResponseStream()?
在MSDN示例不会关闭或异常处理任何事情.
我处理了流,这引起了很大的问题.因为GetResponseStream()(总是?/有时?)返回相同的实例.因此,当我获得响应流然后处理它时,可能会将异常重新抛出到另一个层,该层也会获得响应流,它将被处理掉并且不可读并因此而抛出更多异常.
小智 7
简短的回答是您不必处置它,尽管处理IDisposable您拥有的任何物体是一个很好的练习.
实际上,尝试处理WebException.Response或从其返回的流会导致您提到的问题,因为您可能会遇到尝试在上部调用链的异常处理程序中读取其属性的代码.
不安排它是安全的原因是因为HttpWebRequest内部在它抛出之前从网络流中产生了一个内存流WebException,并且底层网络流已经被关闭/丢弃.因此,它并没有真正关联的任何非托管资源.我假设这是一个让处理异常更容易的决定.
不幸的是,MSDN文档没有关于此行为的任何解释.从技术上讲,实现可能会在未来发生变化,从而导致代码无法处理HttpWebResponse您获得的和/或关联的流WebException,但是由于许多应用程序依赖于当前行为,因此这种行为极不可能改变实现.
我必须补充说,你应该处理IDisposable你拥有的对象是一个好习惯.如果可能,请使用HttpClientclass,以便您根本不必处理这种情况.如果不能,请考虑WebException自己处理并抛出不会泄露WebException给代码调用者的新类型的异常,这样就不会遇到调用者WebException.Response在处理后尝试访问的情况.
免责声明:我为Microsoft工作,但这并不代表我的雇主或.NET Framework团队的观点.不保证暗示.
您应该处置该流,因为它可能保存资源。但只有在用完后才将其丢弃。只需在不再需要该流之前停止处理它即可。让流的最后一个用户处理它。
也许,您应该GetResponseStream()只调用一次并显式传递流,以便清楚地表明它是同一个流。