首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpClientFactory - .NET标准-调用Web

HttpClientFactory - .NET标准-调用Web
EN

Stack Overflow用户
提问于 2019-04-01 11:54:17
回答 1查看 1.6K关注 0票数 1

我们目前正在使用HttpClient从MVC应用程序调用Web。

HttpClient是静态助手类的一部分,如下所示

代码语言:javascript
复制
public static class ApiClient
{
    private static HttpClient MyHttpClient()
    {         
        HttpClient client = new HttpClient();               
        ...         
        return client;
    }

    public static T HttpGet<T>(string requestUri)
    {
        using (var client = MyHttpClient())
        {
            ...
        }
    }
}

并且它是从MVC控制器调用的,如下所示

代码语言:javascript
复制
ApiClient.HttpGet<MyModel>("<<API URL>>");

因此,每当调用ApiClient时,都会打开一个新的底层连接,这不是正确的方法。

我阅读了有关HttpClientFactory的内容,并阅读了这个post,并将创建逻辑修改为

代码语言:javascript
复制
private static HttpClient MyHttpClient()
{
    var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
    var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
    var client = httpClientFactory.CreateClient();
    //HttpClient client = new HttpClient();
    ...
    return client;
}

这会阻止即使多次调用也不能打开多个连接吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-01 12:40:00

IHttpClientFactory功能基于依赖注入,静态与依赖注入根本不兼容。正如文档清楚地表明的那样,正确的方法是:

代码语言:javascript
复制
public class ApiClient
{
    private readonly HttpClient _client;

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

    ...
}

然后在ConfigureServices中注册此服务。

代码语言:javascript
复制
services.AddHttpClient<ApiClient>(c => { ... });

客户端类不应该是静态的,也没有理由是静态的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55454512

复制
相关文章

相似问题

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