为了账号安全,请及时绑定邮箱和手机立即绑定

HttpClient和HttpClientHandler必须处理吗?

HttpClient和HttpClientHandler必须处理吗?

牧羊人nacy 2019-06-19 17:05:18
HttpClient和HttpClientHandler必须处理吗?System.Net.Http.HttpClient和System.Net.Http.HttpClientHandler在.NET Framework4.5中实现IDisposable(通过System.Net.Http.HttpMessageInvoker).这个using声明文件说:通常,当您使用IDisposable对象时,您应该在Using语句中声明并实例化它。这个答案使用此模式:var baseAddress = new Uri("http://example.com");var cookieContainer = new CookieContainer();using (var handler = new HttpClientHandler()  { CookieContainer = cookieContainer })using (var client = new HttpClient(handler) { BaseAddress = baseAddress }){     var content = new FormUrlEncodedContent(new[]     {         new KeyValuePair<string, string>("foo", "bar"),         new KeyValuePair<string, string>("baz", "bazinga"),     });     cookieContainer.Add(baseAddress, new Cookie("CookieName", "cookie_value"));     var result = client.PostAsync("/test", content).Result;     result.EnsureSuccessStatusCode();}但是微软最明显的例子就是Dispose()无论是显式的还是隐式的。例如:这个原创博客文章宣布HttpClient的相关信息。实际MSDN文档为了HttpClient。Bing TranslateSampleGoogleMapsSampleWorldBankSample在公告有人问微软员工:在检查了您的示例之后,我发现您没有对HttpClient实例执行Dispose操作。我在我的应用程序上使用了HttpClient的所有实例并使用了Use语句,并且我认为这是正确的方法,因为HttpClient实现了IDisposable接口。我在正确的道路上吗?他的回答是:一般来说,这是正确的,尽管您必须小心使用“和”异步“,因为它们不是真正混合在.NET 4中,在.NET 4.5中,您可以在”使用“语句中使用”等待“。顺便说一句,您可以像您喜欢的那样多次重用相同的HttpClient,所以通常不会一直创建/处理它们。对于这个问题,第二段是多余的,它不关心您可以使用HttpClient实例多少次,而是关心在不再需要HttpClient实例之后是否需要将它释放。(更新:事实上,第二段是答案的关键,如下所示,由@DPeden提供。)所以我的问题是:考虑到当前的实现(.NET Framework4.5),是否有必要在HttpClient和HttpClientHandler实例上调用Dispose()?澄清:我所说的“必要”是指如果不处理有任何负面后果,如资源泄漏或数据损坏风险。如果没有必要,这是否是一个“良好的实践”,因为他们实现了IDisposable?如果有必要(或建议),是这段代码上面提到过安全地实现它(对于.NET Framework4.5)?如果这些类不需要调用dist(),为什么它们被实现为IDisposable?如果他们需要,或者如果这是一种推荐的做法,微软的例子是误导还是不安全?
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

据我理解,呼唤Dispose()只有在锁定以后需要的资源时(比如特定的连接),才有必要。总是推荐释放不再使用的资源,即使不再需要它们,仅仅因为您不应该使用它们一般保留不使用的资源(双关意)。

微软的例子不一定是不正确的。当应用程序退出时,将释放所有使用的资源。在这个例子中,这几乎是在HttpClient已经用完了。在类似情况下,显式调用Dispose()有点多余。

但是,通常情况下,当一个类实现IDisposable,我们的理解是你应该Dispose()一旦你做好充分的准备和能力。我认为这种情况在如下情况下尤其正确HttpClient其中没有明确记录资源或连接是否被保存/打开。在重新使用连接的情况下(很快),您将需要放弃Dipose()在这种情况下,你还没有“完全准备好”。

另见:IDisposable.Disposed方法何时调用Dispose


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 1326 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信