【问题标题】:How can we use HttpClient in ASP.Net Core?我们如何在 ASP.Net Core 中使用 HttpClient?
【发布时间】:2019-09-14 22:32:01
【问题描述】:

我正在编写 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;
            }
        }
    }
}

【问题讨论】:

    标签: c# asp.net-core asp.net-core-2.0


    【解决方案1】:

    Microsoft documentation here.

    1. ConfigureServices中注册HttpClient

      1a。为typed clients

      services.AddHttpClient<ITypedClientService, TypedClientService>();
      

      1b。为named clients

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

      1c。为Basic usage

      services.AddHttpClient();
      
    2. HttpClient 注入您的控制器。

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

      2a。为typed clients

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

      2b。为named clients

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

      2c。为Basic usage

          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,新的就是胶水。让HttpClientFactory 和框架管理生命周期和实例化。

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

    【讨论】:

    • 最好改用HttpClientFactory
    • @poke,这就是我的意思
    • 但我有疑问如何以这种方式将 url 发送到服务,因为每次请求的 url 都是不同的?
    • @Faraz 即Basic usage
    • @Faraz,我扩展了答案
    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多