发布于 2015-10-01 16:18:46
您应该处理该流,因为它可能包含资源。但只有当你把它处理完后才能处理掉它。只需在您不再需要流之前停止处理它。让流的最后一个用户处理它。
也许,您应该只调用GetResponseStream()一次,并显式地传递流,这样就可以清楚地看到它是同一个流。
发布于 2017-03-31 02:03:44
一个简单的答案是,您不必将其释放,尽管处理您拥有的任何IDisposable对象是一个很好的练习。
实际上,尝试释放WebException.Response或从中返回的流会导致您提到的问题,因为您可能会遇到试图在上级调用链的异常处理程序中读取其属性的代码。
不释放它是安全的原因是因为HttpWebRequest内部在抛出WebException之前从网络流生成内存流,并且底层网络流已经关闭/处理。因此,在这一点上,它实际上没有任何非托管资源。我认为这是一个让异常更容易处理的决定。
不幸的是,MSDN文档对此行为没有任何解释。从技术上讲,将来的实现可能会发生变化,导致代码出现问题,无法处理从WebException获得的WebException和/或相关流,但考虑到许多应用程序依赖于当前的行为,这种行为很难改变实现。
不过,我必须补充一点,这是一个很好的做法,您应该释放您自己的IDisposable对象。如果可能的话,使用HttpClient类代替,这样您就完全不必处理这种情况了。如果不能,请考虑自己处理WebException,并抛出不向代码调用方公开WebException的新类型异常,这样就不会遇到调用方在释放WebException.Response后试图访问它的情况。
免责声明:我为微软工作,但这并不代表我的雇主或.NET框架团队的观点。没有暗示担保。
https://stackoverflow.com/questions/32891627
复制相似问题