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 语句。第二个usingHttpResponseMessage 执行相同的操作。您可以阅读有关处理它的信息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 实例化和请求都需要使用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用Apache HttpClient 4.x进行异常重试

httpclient 中post请求重定向

apach的httpclient怎么处理重定向请求?cookie信息怎么设置?session怎么保持?

HttpClient使用总结

HttpClient使用详解

如何使用HttpClient