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

20

我正在编写ASP.Net MVC Core 2.2 Web应用程序。我需要使用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;
            }
        }
    }
}

1
请注意,由于IDispose模式,请勿使用using。https://dev59.com/12cs5IYBdhLWcg3w0HOz#54707165 - Bernhard
1个回答

50

在此查看 Microsoft 文档。

  1. ConfigureServices 中注册 HttpClient

    1a. 为类型化客户端注册。

services.AddHttpClient<ITypedClientService, TypedClientService>();

1b. 对于命名客户端

的情况

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

1c. 基本用法

services.AddHttpClient();
  • HttpClient注入到您的控制器中。

    [ApiController]
    public class BotController : ControllerBase
    {
        ...
    

    2a. 对于类型化客户端

        public BotController(..., ITypedClientService httpClient, ...)
        {
            ...
            _httpClient = httpClient;
            ...
        }
    

    2b. 对于命名客户端

        public BotController(..., IHttpClientFactory clientFactory, ...)
        {
            ...
            _httpClient = clientFactory.createClient("someClient");
            ...
        }
    

    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);
            ...
        }
    
    不要自己构建HttpClient,使用new是粘合剂。让HttpClientFactory和框架管理生命周期和实例化。
    注意,使用基本用法会回避为定义的客户端配置策略的好处。

  • 2
    最好使用HttpClientFactory - poke
    1
    @poke,这基本上就是我的意思。 - Jodrell
    但我有一个问题,如何以这种方式将URL发送到服务中,因为每次请求的URL都不同? - Faraz
    1
    @Faraz,这是基本用法 - Jodrell
    2
    @Faraz,我扩展了答案。 - Jodrell

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接