首页 > 解决方案 > 一个用于应用程序实例的 http 客户端

问题描述

我正在尝试在 .net core 3.0 中尽可能高效地使用 http 客户端,但它似乎仍然为每个服务使用一个客户端,例如,我有以下 StockSevices 类,它将容纳我所有与股票有关的调用,我正在使用 asp目前.net core 3.0

public class StockServices
{


    public HttpClient Client { get; }

    public StockServices(HttpClient client)
    {
        client.BaseAddress = new Uri(Constants.BaseApiUrl);
        // GitHub API versioning
          // GitHub requires a user-agent
        client.DefaultRequestHeaders.Add("User-Agent",
            "HttpClientFactory-Sample");

        Client = client;

    }
    public async Task<IEnumerable<RoundTableERPDal.Models.Stock>> GetAspNetDocsIssues()
    {
        var response = await Client.GetAsync(
            "/Stock/All");

        response.EnsureSuccessStatusCode();

        var result = await response.Content.ReadAsStringAsync();

        return JsonConvert.DeserializeObject<IEnumerable<RoundTableERPDal.Models.Stock>>(result);


    }

我已将它放在我的启动文件中,但我没有得到的是如何传递全局 HTTP 客户端,因为我们打算使用同一个客户端来阻止对打开的许多端口的调用降级。

在我的启动 cs.

  // This method gets called by the runtime. Use this method to add services to the container.
   public void ConfigureServices(IServiceCollection services)
   {
        services.AddControllers();
        services.Configure<ConnectionStringConfig>(Configuration);

        services.AddHttpClient("externalservice", c =>
        {
            // Assume this is an "external" service which requires an API KEY
            c.BaseAddress = new Uri("https://localhost:5001/");
        });
        services.AddSwaggerGen(c =>

        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "Api For RoundTable A Complete ERP for warehouse managment", Version = "v1" });
        });

  }

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

解决方案


当您需要的是Typed客户端时,您添加了一个Named客户端

//...

services.AddHttpClient<StockServices>(client => {
    // Assume this is an "external" service which requires an API KEY
    client.BaseAddress = new Uri(Constants.BaseApiUrl);
    // GitHub API versioning
    // GitHub requires a user-agent
    client.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

//...

如果StockServices最终被抽象化,则可以对其接口进行相同的操作

services.AddHttpClient<IStockServices, StockServices>(client => {
    // Assume this is an "external" service which requires an API KEY
    client.BaseAddress = new Uri(Constants.BaseApiUrl);
    // GitHub API versioning
    // GitHub requires a user-agent
    client.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

服务的样子

public class StockServices: IStockServices {    
    private readonly HttpClient client;

    public StockServices(HttpClient client) {
        this.client = client;
    }

    public async Task<IEnumerable<RoundTableERPDal.Models.Stock>> GetAspNetDocsIssues() {
        using(var response = await client.GetAsync("/Stock/All")) {

            response.EnsureSuccessStatusCode();

            var result = await response.Content.ReadAsStringAsync();

            return JsonConvert.DeserializeObject<IEnumerable<RoundTableERPDal.Models.Stock>>(result);
        }
    }
}

参考如何通过 HttpClientFactory 使用类型化客户端


推荐阅读