HttpClient 实例化和请求都需要使用 [重复]
Posted
技术标签:
【中文标题】HttpClient 实例化和请求都需要使用 [重复]【英文标题】:Is using required for both HttpClient instantiation AND request [duplicate] 【发布时间】:2020-01-22 17:33:50 【问题描述】:在这段代码中:
using (var httpClient = new HttpClient())
using var request = await httpClient.DeleteAsync($"https://somesite.com");
第二个using
是必需的还是多余的?
【问题讨论】:
【参考方案1】:一旦超出其范围,HttpClient
对象的Dispose
就会出现using
语句。第二个using
对HttpResponseMessage
执行相同的操作。您可以阅读有关处理它的信息here,但通常这应该涵盖它:
在大多数情况下,来自底层的响应正文 连接(Socket)被完全接收,而字节数据,代表 内容将自动缓冲到内存流中。这 在使用 HttpClient API 的大多数重载(GetAsync、 PostAsync 和 SendAsync)。
一旦数据完成缓冲,底层连接 用于发出请求的将变为空闲并被标记为具有 完全的。它也将与 HttpContentStream 解除关联 因此可以通过 HttpClient。
在 HttpResponseMessage 上手动调用 dispose 时,在上面 情况下,因为连接已经释放,所以调用 Dispose 只会处理 HttpContent MemoryStream。
关于最佳实践,您可以阅读:
最安全的一般建议是始终丢弃 HttpResponseMessage 使用完毕后。这确实 导致更多的代码噪声,但确保无论 内部和任何未来的变化,你的代码将释放/清理未使用的 资源,如连接尽可能快。意识到 一旦你处理了内容,它将变得对任何人都无法使用 else 谁被传递了对它的引用。
话虽如此,我自己从来没有做过,也从来没有遇到过任何问题;)
我可以补充...
using 语句很有用,但它确实会导致HttpClient
出现问题。请参考this article
我曾经在使用 .NET Framework 时创建了一个带有 HttpClient
私有实例的 IHttpClientFactory
接口,然后将其注入到 API 调用类中。
请注意,.NET Core provides a way 很容易注入 HttpClient
。
基本上,在您的 Startup.cs
类中会发生什么
public void ConfigureServices(IServiceCollection services)
services.AddHttpClient<OAuthClient>(client =>
// you can configure your httpclient here
client.BaseAddress = new Uri("https://www.example.com/api/v3");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "accessToken");
);
然后注入其他类:
public class SomeClass
private HttpClient _client;
public SomeClass(HttpClient client)
_client = client;
public async Task GetStuffFromAPI(string requestUrl)
await _client.GetAsync(reqestUrl);();
上面的情况是:每次注入HttpClient
时,它都会首先尝试注入您在Startup
类中指定的实例。还有更多,但我会保持这个答案简单
【讨论】:
以上是关于HttpClient 实例化和请求都需要使用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章