我们如何在 ASP.Net Core 中使用 HttpClient?

Far*_*raz 11 c# asp.net-core asp.net-core-2.0

我正在编写 ASP.Net MVC Core 2.2 Web App。我需要使用 HTTP 或 HTTPS 从另一个 Web 服务器获取数据。我该怎么做?

我使用HttpClient.

我有一个接收消息的控制器,它工作正常,但是,我应该构建HttpClient吗?

[Route("api/[controller]")]
[ApiController]
public class MyController : ControllerBase
{
    private readonly IHostingEnvironment _env;
    private readonly ILogger _logger;
    private readonly IUpdateService _updateService;

    public MyController(
        IHostingEnvironment env,
        ILogger<MyController> logger,
        IUpdateService updateService)
    {
        _env = env;
        _logger = logger;
        _updateService = updateService;
    }

    // POST api/values
    [HttpPost]
    public async Task<IAsyncResult> Post([FromBody]Update update)
    {
        using (HttpClient Client = new HttpClient())
        {
            HttpResponseMessage result = Client.GetAsync(uri).Result;
            switch (result.StatusCode)
            {
                case HttpStatusCode.Accepted:
                    return true;
                case HttpStatusCode.OK:
                    return true;
                default:
                    return false;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jod*_*ell 26

微软文档在这里。

  1. 注册HttpClientConfigureServices

    1a. 对于打字客户

    services.AddHttpClient<ITypedClientService, TypedClientService>();
    
    Run Code Online (Sandbox Code Playgroud)

    1b. 对于指定客户

    services.AddHttpClient("someClient", c =>
    {
        c.BaseAddress = new Uri("https://someaddress.com/");
    });
    
    Run Code Online (Sandbox Code Playgroud)

    1c。对于基本用法

    services.AddHttpClient();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将 注入HttpClient到您的控制器中。

    [ApiController]
    public class BotController : ControllerBase
    {
        ...
    
    Run Code Online (Sandbox Code Playgroud)

    2a. 对于打字客户

        public BotController(..., ITypedClientService httpClient, ...)
        {
            ...
            _httpClient = httpClient;
            ...
        }
    
    Run Code Online (Sandbox Code Playgroud)

    2b. 对于指定客户

        public BotController(..., IHttpClientFactory clientFactory, ...)
        {
            ...
            _httpClient = clientFactory.createClient("someClient");
            ...
        }
    
    Run Code Online (Sandbox Code Playgroud)

    2c。对于基本用法

        IHttpClientFactory _clientFactory
    
        public BotController(..., IHttpClientFactory clientFactory, ...)
        {
            ...
            _clientFactory = clientFactory; 
            ...
        }
    
        [HttpPost]
        public async Task<IActionResult> Post([FromBody]Update update)
        {
            ...
            var request = new HttpRequestMessage(
                HttpMethod.Get, 
                "https://someaddress.com/api/resource");
            request.Headers.Add("Accept", "application/vnd.github.v3+json");
            request.Headers.Add("User-Agent", "YourApp");
            var client = _clientFactory.createClient();
            var response = await client.SendAsync(request);
            ...
        }
    
    Run Code Online (Sandbox Code Playgroud)

不要HttpClient自己建造,新的就是胶水。让HttpClientFactory和框架管理生命周期和实例化。

请注意,使用基本用法,您将避免为定义的客户端配置策略的好处。

  • 最好改用 [HttpClientFactory](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2)。 (2认同)
  • @Faraz,我扩展了答案 (2认同)