Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IHttpClientFactory in .NET Core 2.1 Console App references System.Net.Http

Tools

  • Visual Studio 2017 Professional (15.8.7)
  • dotnetcore SDK 2.1.403

Scenario

I'm attempting to create a console app using the dotnet core framework. The console app needs to make API requests.

I've read about the new IHttpClientFactory released as part of dotnet core 2.1.

The official documenation suggests that all I need to add to my project is a reference to the Microsoft.Extensions.Http NuGet package. I've done this.

Problem

I've added the IHttpClientFactory to a class, but visual studio only picks up the System.Net.Http namespace as a suggested reference:

enter image description here

Question

What did I do wrong :S

like image 608
GreenyMcDuff Avatar asked Oct 21 '18 17:10

GreenyMcDuff


People also ask

How do I register IHttpClientFactory in .NET core?

Register an IHttpClientFactory instance in ASP.NET Core You can register an instance of type IHttpClientFactory in the ConfigureServices method of the Startup class by calling the AddHttpClient extension method on the IServiceCollection instance as shown in the code snippet given below.

What is the use of IHttpClientFactory?

IHttpClientFactory : Simplifies defining the handlers to apply for each named client. Supports registration and chaining of multiple handlers to build an outgoing request middleware pipeline. Each of these handlers is able to perform work before and after the outgoing request.

Is IHttpClientFactory a singleton?

public class MyService { // IHttpClientFactory is a singleton, so can be injected everywhere private readonly IHttpClientFactory _factory; public MyService(IHttpClientFactory factory) { _factory = factory; } public async Task DoSomething() { // Get an instance of the typed client HttpClient client = _factory.

What is client factory C#?

HttpClientFactory Key FeaturesIt provides a central place to name and configure our HttpClients . Delegates handlers in HttpClient and implements Polly-based middleware to take advantage of Polly's policies for resiliency. HTTP clients are registered in a factory.


2 Answers

The official documenation suggests that all I need to add to my project is a reference to the Microsoft.Extensions.Http NuGet package. I've done this.

That's true but in order to make things easier, you have to add Microsoft.Extensions.DependencyInjection as a NuGet package, in fact, you can delegate all the creation of httpClient instance to the HttpClientBuilderExtensions which add a lot of extensions methods to create a named or typed HTTPClient here I have written an example for you

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;


namespace TypedHttpClientConsoleApplication
{
    class Program
    {
        public static void Main(string[] args) => Run().GetAwaiter().GetResult();
        public static async Task Run()
        {
            var serviceCollection = new ServiceCollection();


            Configure(serviceCollection);

            var services = serviceCollection.BuildServiceProvider();

            Console.WriteLine("Creating a client...");
            var github = services.GetRequiredService<GitHubClient>();

            Console.WriteLine("Sending a request...");
            var response = await github.GetJson();

            var data = await response.Content.ReadAsStringAsync(); 
            Console.WriteLine("Response data:");
            Console.WriteLine((object)data);

            Console.WriteLine("Press the ANY key to exit...");
            Console.ReadKey();
        }
        public static void Configure(IServiceCollection services)
        {







            services.AddHttpClient("github", c =>
            {
                c.BaseAddress = new Uri("https://api.github.com/");

                c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json"); // GitHub API versioning
                c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample"); // GitHub requires a user-agent
            })                        
            .AddTypedClient<GitHubClient>();
        }
        private class GitHubClient
        {
            public GitHubClient(HttpClient httpClient)
            {
                HttpClient = httpClient;
            }

            public HttpClient HttpClient { get; }

            // Gets the list of services on github.
            public async Task<HttpResponseMessage> GetJson()
            {
                var request = new HttpRequestMessage(HttpMethod.Get, "/");

                var response = await HttpClient.SendAsync(request).ConfigureAwait(false);
                response.EnsureSuccessStatusCode();

                return response;
            }
        }

    }

}

Hope this help

like image 103
BRAHIM Kamel Avatar answered Sep 27 '22 20:09

BRAHIM Kamel


The Microsoft.Extensions.Http, which is default included in the Microsoft.AspNetCore.App package, contains lots of packages which is commonly used for http-related code, it includes the System.Net package for example.

When you use something from the nested packages of Microsoft.Extensions.Http, you still need to reference them by the using statement.

So, nothing is wrong here. Just add a the using System.Net.Http; to your class.

like image 35
Marcus Höglund Avatar answered Sep 27 '22 22:09

Marcus Höglund