我应该在HttpClient中使用Using语句吗?

Kat*_*osa 2 .net c# httpclient asp.net-web-api asp.net-core

我正在创建一个API,充当应用程序和其他2个API之间的桥梁。我想知道最好的方法是什么。我正在使用HttpClient。该应用程序有近一千个用户。

我阅读了这篇文章https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/。我真的不应该使用using语句吗?我也在做同步api调用。这有什么作用吗?我做的效率高吗?

这是我的代码:

[HttpGet]
[Route("api/apiname")]     
public String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){          

    var request = JsonConvert.SerializeObject(getNPRequest);
    string errorMessage = "";           

    try{              
         httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.gettoken());

         var response = httpClient.GetAsync("api/MobileApp/GetNumberP?"
                      + "strCardNumber=" + getNPRequest.strCardNumber
                     + "&strDateOfBirth=" + getNPRequest.strDateOfBirth).Result;
         return response;
    }            
    catch (Exception e){                
        throw utils.ReturnException("GetNumberofP", e, errorMessage);           
    }      
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 8

HttpClient 不需要处理,您应该保留它以便以后重用。

可以使用的一件事(从链接的线程中):

您只需要提供HttpClient工厂并配置方法,LimitedPool其余的 就可以了:

_httpClientPool = new LimitedPool<httpclient>(
CreateHttpClient, client => client.Dispose(), HttpClientLifetime);

using (var httpClientContainer = _httpClientPool.Get())
{ ... use httpClientContainer.Value ... }
Run Code Online (Sandbox Code Playgroud)

httpClientContainer被处置时,HttpClient实际上将其返回到池中以供其他线程使用。当达到使用寿命时,处置将最终调用该Dispose 方法。

在这里查看代码

.Net Core的替代

按照本文档中的描述实施它。

IHttpClientFactory可以通过调用注册AddHttpClient的扩展方法IServiceCollection,里面的Startup.ConfigureServices方法。

services.AddHttpClient();
Run Code Online (Sandbox Code Playgroud)

一旦注册,代码就可以接受IHttpClientFactory可以通过依赖项注入(DI)注入的任何地方的服务。该IHttpClientFactory可用于创建一个HttpClient实例:

public MyConstructor(IHttpClientFactory clientFactory)
{
    _clientFactory = clientFactory;
}

public async Task OnGet()
{
    ....
    var client = _clientFactory.CreateClient();

    var response = await client.SendAsync(request);
    ...
}
Run Code Online (Sandbox Code Playgroud)

无需使用using()

  • __仅.Net Core的替代方法__此声明肯定是错误的。您应该已经阅读了链接的文档,该文档指出:面向.NET Framework的_Projects需要安装Microsoft.Extensions.Http NuGet软件包。面向.NET Core并引用Microsoft.AspNetCore.App元包的项目已经包含Microsoft.Extensions.Http package_ (3认同)