首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用.net-core瞬态服务的IHttpClientFactory

正确使用.net-core瞬态服务的IHttpClientFactory
EN

Stack Overflow用户
提问于 2020-09-18 03:14:28
回答 1查看 1.2K关注 0票数 1

我正在研究在我的asp.net核心应用程序中使用IHttpClientFactory来调用外部app。我见过一些在服务类的构造函数中创建客户端工厂的示例。然后,该类的方法调用该客户端工厂来生成HttpClient的实例,以发出Http请求。如以下示例代码所示:

代码语言:javascript
复制
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?那么,以下不是使用工厂的更有效的方法吗?

代码语言:javascript
复制
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);
            ...
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-18 04:17:02

我会认为自己创建HttpClient是一种糟糕的做法,在self中,你可以控制创建了多少。如果MyTransientService是暂时的,您将最终创建大量套接字连接(每个实例/请求一个套接字连接)创建HttpClient以供重用。

看一下键入的客户端:https://docs.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

代码语言:javascript
复制
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);
        ...
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63944823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档