一个http客户端作为应用程序实例

时间:2019-11-24 16:36:34

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

我正在尝试在.net core 3.0中尽可能有效地使用http客户端,但是似乎仍在每个服务中使用客户端,例如,我有以下StockSevices类,该类将容纳我所有与股票I有关的调用目前正在使用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客户端,因为我们打算使用相同的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" });
        });

  }

1 个答案:

答案 0 :(得分: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);
        }
    }
}

参考How to use Typed Clients with HttpClientFactory