【问题标题】:HttpClientFactory - .NET Standard - Invoke Web APIHttpClientFactory - .NET 标准 - 调用 Web API
【发布时间】:2019-04-01 11:54:17
【问题描述】:

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

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

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 控制器调用的,如下所示

ApiClient.HttpGet<MyModel>("<<API URL>>");

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

我阅读了HttpClientFactory 并阅读了这个post 并导致将创建逻辑修改为

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;
}

即使多次调用,这是否会阻止打开多个连接?

【问题讨论】:

  • @PavelAnikhouski 是的!出于同样的原因,我想使用问题后面部分中描述的 HttpClientFactory。
  • 顺便说一句,你的“创作逻辑”是完全错误的。你应该永远创建一个新的ServiceCollection。你应该在需要HttpClient的地方注入IHttpClientFactory
  • @CamiloTerevinto 同意。由于 'ApiClient' 类被声明为静态,我将能够注入 'IHttpClientFactory ',这就是我无法继续进行的地方。如果您能提供一些见解,将会很有帮助。
  • 你不能用单例代替吗?
  • @CamiloTerevinto 是的,单例可能会有所帮助,但 IHttpClientFactory 似乎可用于解决这种确切情况,因此我想使用它。我不介意在从 MVC 调用 API 时更改调用 ApiClient 的方式。

标签: c# asp.net-core httpclient httpclientfactory


【解决方案1】:

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

public class ApiClient
{
    private readonly HttpClient _client;

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

    ...
}

然后你在ConfigureServices注册这个服务:

services.AddHttpClient<ApiClient>(c => { ... });

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多