【问题标题】:Is using required for both HttpClient instantiation AND request [duplicate]HttpClient 实例化和请求都需要使用 [重复]
【发布时间】:2020-01-22 17:33:50
【问题描述】:

在这段代码中:

using (var httpClient = new HttpClient())
{
    using var request = await httpClient.DeleteAsync($"https://somesite.com");
}

第二个using 是必需的还是多余的?

【问题讨论】:

    标签: c# asp.net-core


    【解决方案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 类中指定的实例。还有更多,但我会保持这个答案简单

    【讨论】:

      猜你喜欢
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多