- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
System.Net.Http.HttpClient和 System.Net.Http.HttpClientHandler在 .NET Framework 4.5 中实现 IDisposable(通过 System.Net.Http.HttpMessageInvoker )。
using
语句文档说:
As a rule, when you use an IDisposable object, you should declare and instantiate it in a using statement.
This answer使用这种模式:
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();
}
但是来自 Microsoft 的最明显的示例并没有显式或隐式地调用 Dispose()
。例如:
在announcement的评论,有人问微软员工:
After checking your samples, I saw that you didn't perform the dispose action on HttpClient instance. I have used all instances of HttpClient with using statement on my app and I thought that it is the right way since HttpClient implements the IDisposable interface. Am I on the right path?
他的回答是:
In general that is correct although you have to be careful with "using" and async as they dont' really mix in .Net 4, In .Net 4.5 you can use "await" inside a "using" statement.
Btw, you can reuse the same HttpClient as many times are [as] you like so typically you won't create/dispose them all the time.
第二段对于这个问题来说是多余的,这个问题不关心你可以使用多少次 HttpClient 实例,而是关心在你不再需要它之后是否有必要处置它。
(更新:事实上,第二段是答案的关键,如下由@DPeden 提供。)
所以我的问题是:
鉴于当前的实现 (.NET Framework 4.5),是否有必要在 HttpClient 和 HttpClientHandler 实例上调用 Dispose()?澄清:“必要”是指如果不处置会产生任何负面后果,例如资源泄漏或数据损坏风险。
如果没有必要,这会是一个“好的做法”吗,因为他们实现了 IDisposable?
如果有必要(或推荐),是 this code上面提到安全地实现它(对于 .NET Framework 4.5)?
如果这些类不需要调用 Dispose(),为什么将它们实现为 IDisposable?
如果他们需要,或者如果这是推荐的做法,Microsoft 示例是否具有误导性或不安全?
最佳答案
普遍的共识是您不需要(不应该)处理 HttpClient。
许多密切参与其工作方式的人都说过这一点。
参见 Darrel Miller's blog post和相关的 SO 帖子:HttpClient crawling results in memory leak供引用。
我还强烈建议您阅读 the HttpClient chapter from Designing Evolvable Web APIs with ASP.NET有关引擎盖下发生的事情的上下文,特别是此处引用的“生命周期”部分:
Although HttpClient does indirectly implement the IDisposable interface, the standard usage of HttpClient is not to dispose of it after every request. The HttpClient object is intended to live for as long as your application needs to make HTTP requests. Having an object exist across multiple requests enables a place for setting DefaultRequestHeaders and prevents you from having to re-specify things like CredentialCache and CookieContainer on every request as was necessary with HttpWebRequest.
甚至打开 DotPeek。
关于c# - 是否必须在请求之间处理 HttpClient 和 HttpClientHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15705092/
这是我得到的错误: Cannot initialize type 'HttpClientHandler' with a collection initializer because it does n
我需要将数据发送到需要证书授权的网络 API。但我不知道如何将证书添加到 .Net 4.5 中的处理程序。这是代码: // Import the certificate X509Certificate
我们有许多 .NET Core 2.1 服务和一些 .NET Framework 4.7.1 应用程序在客户的 Windows Server(我认为是 2016 年)机器上运行。客户设置了所有流量都需
我想使用 HttpClient 从我的 ViewModel 发送两个请求(首先是 GET,然后是 POST)。 GET 请求完成且没有任何错误。但是如果我发送 POST 请求我得到异常: {Syste
场景如下:用户使用证书身份验证连接到网络服务器,服务器正在调用其他服务,我想转发/发送我在服务器上收到的证书以通过服务对用户进行身份验证。 我在网络服务器上使用以下代码在 HttpClientHand
在 .net core 2.2(或更高版本)中,可以编写以下代码(在客户端)向启用了双向 TLS 身份验证的 REST 服务发送 json 请求并从中获取 json 响应: var clientHan
以下代码抛出“PlatformNotSupportedException”“此平台不支持操作” 它是一个 NET 标准库(尝试针对 1.4 和 2.0 进行编译),被作为 Web 应用程序运行的 .N
我有 10-150 个长寿类对象,它们调用使用 HttpClient 执行简单 HTTPS API 调用的方法。 PUT 调用示例: using (HttpClientHandler handler
当使用 HttpClient 实例和 HttpClientHandler 实例(.Net Framework,不使用 Core)时,是否可以稍后以任何方式访问 HttpClientHandler 实例
我目前正在配置我的 httpclientfactory这边走 HttpClientHandler httpClientHandler = new HttpClientHandler() { S
我有这个请求处理程序: var httpClientHandler = new HttpClientHandler { Proxy = new WebProxy(proxy.Address,
我想过用HttpClientFactory,但是调用的时候需要附上证书目前使用的是HttpClient,但是不知道怎么附上证书。 httpClient代码如下: HttpClientHandler h
我正在尝试将 Elasticsearch NEST 与 .NET Core 和我们的 Elasticsearch 实例结合使用。我们通过 SSL 连接,它有一个我们需要以编程方式接受的通配符证书。我想
我正在使用以下代码从使用 .Net Core 2.0 的 API 获取数据。 using (var handler = new HttpClientHandler() { Defaul
System.Net.Http.HttpClient和 System.Net.Http.HttpClientHandler在 .NET Framework 4.5 中实现 IDisposable(通过
在 中运行以下内容.NET 框架 4.7.2 控制台应用程序和 some_url指向我的 Windows 网络中使用 Kerberos 的服务器,我得到一个 HTTP 代码 200 背部: var h
我正在使用 Microsoft HTTP Client Libraries - PCL (通过 NuGet 安装)与公共(public) REST API 通信。因为我在公司防火墙后面,所以我需要在
我正在寻找 Mono HttpClient 堆栈的可移植替代品。可移植 Mono 版本 [常规 Mono 堆栈的一部分] 有错误。我一直在尝试修复影响我们项目的一个特定错误。由于异步操作所需的库的高度
我正在尝试使用 HTTP 客户端向网站发送表单。该网站然后根据我的请求返回一个包含数据的列表。该过程本身运行良好,但我必须执行 3 个请求,而当我在浏览器中手动执行时,一个请求就足够了。 在浏览器中,
代码如下: public static async Task DownloadPageWithCookiesAsync(string url) { HttpClientHandler hand
我是一名优秀的程序员,十分优秀!