.NET Core HttpClientFactory+Consul實現服務發現
阿新 • • 發佈:2020-05-24
### 前言
上篇文章[.NET Core HttpClient+Consul實現服務發現](https://www.cnblogs.com/wucy/p/12926717.html)提到過,HttpClient存在套接字延遲釋放的問題,高併發情況導致埠號被耗盡引起伺服器拒絕服務的問題。好在微軟意識到了這個問題,從.NET Core 2.1版本開始推出了HttpClientFactory來彌補這個問題。關於更詳細的HttpClientFactory介紹可以檢視微軟官方文件 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#httpclient-and-lifetime-management 我們瞭解到想把自定義的HttpMessageHandler注入到HttpClient內部,必須要通過建構函式。接下來我們就慢慢發覺如何給HttpClientFactory使用我們自定義的Handler。
### HttpClient的建立
相信大家都已經清楚使用HttpClientFactory從services.AddHttpClient()注入相關類開始,我們就從這裡開始入手。先貼上原始碼地址[HttpClientFactoryServiceCollectionExtensions原始碼](https://github.com/dotnet/extensions/blob/v3.1.4/src/HttpClientFactory/Http/src/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs#L22)然後我們大概的看一下我們關注的實現方法,大致如下,程式碼有刪減
```
///
/// Adds the and related services to the .
///
/// The .
/// The .
public static IServiceCollection AddHttpClient(this IServiceCollection services)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
.....
//
// Core abstractions
//
services.TryAddTransient();
services.TryAddSingleton();
services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService());
services.TryAddSingleton(serviceProvider => serviceProvider.GetRequiredService());
.....
return services;
}
```
通過原始碼我們可以看到IHttpClientFactory的實現類注入其實是DefaultHttpClientFactory,拿我們繼續順著原始碼繼續查詢[DefaultHttpClientFactory原始碼地址](https://github.com/dotnet/extensions/blob/v3.1.4/src/HttpClientFactory/Http/src/DefaultHttpClientFactory.cs#L117)找到了我們熟悉的名字