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

C# 我应该在HttpClient中使用Using语句吗?,c#,.net,asp.net-web-api,asp.net-core,httpclient,C#,.net,Asp.net Web Api,Asp.net Core,Httpclient,我正在创建一个API,作为应用程序和其他两个API之间的桥梁。我想知道做这件事的最好方法是什么。我正在使用HttpClient。该应用程序拥有近千名用户 我读了这篇文章。我真的不应该使用using语句吗?我也在做同步api调用。这有什么影响吗?我所做的有效率吗 这是我的密码: [HttpGet] [Route("api/apiname")] public String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){

我正在创建一个API,作为应用程序和其他两个API之间的桥梁。我想知道做这件事的最好方法是什么。我正在使用HttpClient。该应用程序拥有近千名用户

我读了这篇文章。我真的不应该使用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);           
    }      
}

如果您使用的是asp.net core,Microsoft的这篇文章将解释使用HttpClient的正确方法:

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

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

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

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

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


不要使用同步呼叫。使您的操作方法异步,并等待http客户端的异步方法。Asp.net core完全支持异步代码,因此阻止请求是没有意义的,这样做会限制应用程序的可扩展性。

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

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

您只需提供您的
HttpClient
factory和dispose方法以及
LimitedPool
其余部分:

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

using (var httpClientContainer = _httpClientPool.Get())
{ ... use httpClientContainer.Value ... }
注册后,代码可以接受
IHttpClientFactory
任何可以使用依赖项注入(DI)注入服务的地方。
IHttpClientFactory
可用于创建
HttpClient
实例:

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

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

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

无需使用
using()

asp.net core http客户端支持旨在避免您在问题中链接的文章中说明的所有问题。仅.net core的替代方案此声明绝对错误。您应该已经阅读了链接文档,其中说明:针对.NET Framework的项目需要安装Microsoft.Extensions.Http NuGet包。以.NET Core为目标并引用Microsoft.AspNetCore.App元包的项目已经包括Microsoft.Extensions.Http包当您使用更改了2行代码的异步时,为什么要使用阻止同步调用<代码>公共异步任务GetNumberofP([FromUri]GetNumberofPRequest getNPRequest)和
var response=wait httpClient.GetAsync(…)相关:可能重复我的答案对你有帮助吗,凯特?
public MyConstructor(IHttpClientFactory clientFactory)
{
    _clientFactory = clientFactory;
}

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

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