.NET Core 瞬态服务的 IHttpClientFactory 的正确用法

问题描述 投票:0回答:1

我正在考虑使用

IHttpClientFactory
在我的 ASP.NET Core 应用程序中调用外部 API。我见过一些在服务类的构造函数中创建客户端工厂的示例。然后该类的方法调用客户端工厂来生成
HttpClient
的实例来发出 HTTP 请求。就像下面的示例代码:

public class MyTransientService: IMyService
{
    private readonly IHttpClientFactory _clientFactory;

    public MyTransientService(
        IHttpClientFactory clientFactory
    )
    {
        _clientFactory = clientFactory;
    }

    public async Task<MyData> GetData()
    {
        //construct the request
        var httpClient = _clientFactory.CreateClient();
        var response = await client.SendAsync(request);
        ...
    }
}

如果该服务在 Startup.cs 中注册为瞬态服务,那么每次调用该服务时是否都会生成一个新的

HttpClientFactory
实例?每个请求一个新的
HttpClientFactory
?那么以下不是更有效的使用工厂的方式吗?

public class MyTransientService: IMyService
{
    private readonly HttpClient _client;

    public MyTransientService(HttpClient client)
    {
        _client = client;
    }

    public async Task<MyData> GetData()
    {
        Uri uri = new Uri(StaticUtils.AddQueryString(url, props));
        var response = await _client.SendAsync(request);
        ...
    }
}
c# asp.net-core dependency-injection dotnet-httpclient
1个回答
1
投票

我认为自己创建 HttpClient 是一种不好的做法,您可以自行控制创建的数量。如果

MyTransientService
是暂时的,您最终将创建大量套接字连接(每个实例/请求一个)
HttpClient
被创建以供重用。

查看类型化客户端:https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient("hello", c =>
    {
        c.BaseAddress = new Uri("http://localhost:5000");
    })
    .AddTypedClient<MyTransientService>();

    services.AddControllers();
}

public class MyTransientService: IMyService
{
    private readonly HttpClient _client;

    public MyTransientService(
        HtpClient client
    )
    {
        _client = client;
    }

    public async Task<MyData> GetData()
    {
        Uri uri = new Uri(StaticUtils.AddQueryString(url, props));
        var response = await _client.SendAsync(request);
        ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.