Reputation: 91
I am planning to use Microsoft.Extensions.Http package in my ASP.NET Framework 4.7.2 Webforms project. Since there is no built-in DI Container in .NET Framework, I am not using the DI packages. Based on this answer, I am not sure about the last line -
Microsoft.Extensions.Http provides the HttpClientFactory only, not the new optimized HttpClient. This is only available in .NET Core 2.1
Can I implement IHttpClientFactory without DI and using singleton method in my Framework project and get rid of the 2 problems of using HttpClient directly - Socket Exhaustion and DNS resolution? Is there something else that needs to be done based on the above comment
Upvotes: 9
Views: 8438
Reputation: 172825
Unfortunately, the use of the HttpClientFactory
is tightly integrated with the DI framework. Fortunately, creating a new IHttpClientFactory
without making use of the full DI infrastructure can be done in a few lines:
IHttpClientFactory factory = new ServiceCollection()
.AddHttpClient()
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>();
With the code above you create new new service provider (which is the MS.DI Container) that just contains the registrations for the HTTP client package, which includes a registration for IHttpClientFactory
, and the IHttpClientFactory
is directly pulled from the container. The factory is stored in a variable, while the container itself is no longer used.
A full working Console application would like like this:
// This requires the 'Microsoft.Extensions.Http` package to be installed
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
internal class Program
{
static async Task Main(string[] args)
{
IHttpClientFactory factory = new ServiceCollection()
.AddHttpClient()
.BuildServiceProvider()
.GetRequiredService<IHttpClientFactory>();
HttpClient client = factory.CreateClient();
string html = await client.GetStringAsync(
"https://blogs.cuttingedge.it/steven/posts/2011/" +
"meanwhile-on-the-command-side-of-my-architecture/");
string plainText = HttpUtility.HtmlDecode(
Regex.Replace(
Regex.Replace(html, "<[^>]*>", string.Empty),
@"^\s*$\n", string.Empty, RegexOptions.Multiline));
Console.WriteLine(plainText);
Console.ReadLine();
}
}
Best is to cache the IHttpClientFactory
for the lifetime of your application and not recreate it on the fly.
Upvotes: 18