Gopi
Gopi

Reputation: 5887

HttpClientFactory - .NET Standard - Invoke Web API

We are currently using the HttpClient to invoke the Web APIs from the MVC application.

The HttpClient is part of a static helper class as shown below

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())
        {
            ...
        }
    }
}

and it is invoked from the MVC controller as given below

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

So whenever the ApiClient is invoked, a new underlying connection will be opened which isn't the right way.

I read about HttpClientFactory and read this post and I resulted in modifying the creation logic as

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

Will this prevent from opening multiple connections even if invoked multiple times?

Upvotes: 1

Views: 1940

Answers (1)

Chris Pratt
Chris Pratt

Reputation: 239430

The IHttpClientFactory functionality is predicated on dependency injection, and statics are fundamentally incompatible with dependency injection. As the docs clearly show, the correct way to do this is:

public class ApiClient
{
    private readonly HttpClient _client;

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

    ...
}

And then you register this service in ConfigureServices:

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

The client class should not be static and there's no reason for it to be static.

Upvotes: 4

Related Questions