1. 程式人生 > >.NET Core HttpClientFactory+Consul實現服務發現

.NET Core HttpClientFactory+Consul實現服務發現

### 前言   上篇文章[.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)找到了我們熟悉的名字