Tools
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:
Question
What did I do wrong :S
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.
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.
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.
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.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With