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

时间:2019-03-28 06:22:17

标签: c# .net asp.net-web-api asp.net-core httpclient

我正在创建一个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);           
    }      
}

2 个答案:

答案 0 :(得分:8)

HttpClient不需要处理,您应该坚持使用它以便以后重用。

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

  

您只需提供自己的HttpClient工厂并处理方法和   LimitedPool完成其余工作:

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

using (var httpClientContainer = _httpClientPool.Get())
{ ... use httpClientContainer.Value ... }
     

当处置httpClientContainer时,HttpClient实际上返回到池中供其他线程使用。什么时候   寿命已到,下一个处置将最终调用Dispose   方法。

查看代码here

.Net Core的替代

按照this document中的说明实施。

可以通过在IHttpClientFactory方法内部的AddHttpClient上调用IServiceCollection扩展方法来注册Startup.ConfigureServices

services.AddHttpClient();

注册后,代码可以在可以通过依赖项注入(DI)注入服务的任何地方接受IHttpClientFactoryIHttpClientFactory可用于创建HttpClient实例:

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

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

    var response = await client.SendAsync(request);
    ...
}

无需使用using()

答案 1 :(得分:1)

如果您使用的是asp.net核心,则Microsoft在本文中介绍了使用HttpClient的正确方法:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2#typed-clients

我通常使用本文中介绍的类型化客户端方法。

这基本上意味着我将类中的http客户端的注入委托给asp.net核心容器(控制器类,服务,过滤器等)

这样做,您可以通过添加所需的所有请求标头来安全地修改类中的http客户端(通常在类的构造函数中进行操作)。

您不必在注入的http客户端上调用dispose,只需使用它即可。

asp.net核心容器将为您管理http客户端的生存期以及http客户端实例使用的资源池,以便您的应用程序不会泄漏资源。所有这些都是自动发生的。

请勿使用同步通话。使您的操作方法异步,并等待http客户端的异步方法。 Asp.net核心完全支持异步代码,并且阻止请求没有意义,这样做会限制应用程序的可伸缩性。