首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该关闭/处理WebException.Response.GetResponseStream()吗?

应该关闭/处理WebException.Response.GetResponseStream()吗?
EN

Stack Overflow用户
提问于 2015-10-01 15:40:12
回答 2查看 2.5K关注 0票数 8

当我捕获.NET WebException时,应该关闭/释放Response.GetResponseStream()吗?

MSDN示例不会关闭或释放异常中的任何内容。

许多所以 答案建议处理响应和/或流。

我处理了这条小溪,这引起了很大的问题。因为GetResponseStream() (总是?/有时?)返回相同的实例。所以当我得到响应流,然后释放它,然后可能重新抛出异常到另一个也得到响应流的层,它将被释放和不可读,并因此抛出更多的异常。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-01 16:18:46

您应该处理该流,因为它可能包含资源。但只有当你把它处理完后才能处理掉它。只需在您不再需要流之前停止处理它。让流的最后一个用户处理它。

也许,您应该只调用GetResponseStream()一次,并显式地传递流,这样就可以清楚地看到它是同一个流。

票数 3
EN

Stack Overflow用户

发布于 2017-03-31 02:03:44

一个简单的答案是,您不必将其释放,尽管处理您拥有的任何IDisposable对象是一个很好的练习。

实际上,尝试释放WebException.Response或从中返回的流会导致您提到的问题,因为您可能会遇到试图在上级调用链的异常处理程序中读取其属性的代码。

不释放它是安全的原因是因为HttpWebRequest内部在抛出WebException之前从网络流生成内存流,并且底层网络流已经关闭/处理。因此,在这一点上,它实际上没有任何非托管资源。我认为这是一个让异常更容易处理的决定。

不幸的是,MSDN文档对此行为没有任何解释。从技术上讲,将来的实现可能会发生变化,导致代码出现问题,无法处理从WebException获得的WebException和/或相关流,但考虑到许多应用程序依赖于当前的行为,这种行为很难改变实现。

不过,我必须补充一点,这是一个很好的做法,您应该释放您自己的IDisposable对象。如果可能的话,使用HttpClient类代替,这样您就完全不必处理这种情况了。如果不能,请考虑自己处理WebException,并抛出不向代码调用方公开WebException的新类型异常,这样就不会遇到调用方在释放WebException.Response后试图访问它的情况。

免责声明:我为微软工作,但这并不代表我的雇主或.NET框架团队的观点。没有暗示担保。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32891627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档