Browse Source

使用HttpClientFactory

陈国伟 4 years ago
parent
commit
7fccdba5cf

+ 3 - 3
FastGithub.Scanner/DomainAddressProviders/GithubMetaProvider.cs

@@ -19,7 +19,7 @@ namespace FastGithub.Scanner.DomainAddressProviders
     sealed class GithubMetaProvider : IDomainAddressProvider
     {
         private readonly IOptionsMonitor<GithubOptions> options;
-        private readonly HttpClientFactory httpClientFactory;
+        private readonly IHttpClientFactory httpClientFactory;
         private readonly ILogger<GithubMetaProvider> logger;
         private const string META_URI = "https://api.github.com/meta";
 
@@ -35,7 +35,7 @@ namespace FastGithub.Scanner.DomainAddressProviders
         /// <param name="logger"></param>
         public GithubMetaProvider(
             IOptionsMonitor<GithubOptions> options,
-            HttpClientFactory httpClientFactory,
+            IHttpClientFactory httpClientFactory,
             ILogger<GithubMetaProvider> logger)
         {
             this.options = options;
@@ -57,7 +57,7 @@ namespace FastGithub.Scanner.DomainAddressProviders
 
             try
             {
-                using var httpClient = this.httpClientFactory.Create();
+                var httpClient = this.httpClientFactory.CreateClient(nameof(FastGithub));
                 var meta = await this.GetMetaAsync(httpClient, setting.MetaUri);
                 if (meta != null)
                 {

+ 3 - 3
FastGithub.Scanner/DomainAddressProviders/IPAddressComProvider.cs

@@ -18,7 +18,7 @@ namespace FastGithub.Scanner.DomainAddressProviders
     sealed class IPAddressComProvider : IDomainAddressProvider
     {
         private readonly IOptionsMonitor<GithubOptions> options;
-        private readonly HttpClientFactory httpClientFactory;
+        private readonly IHttpClientFactory httpClientFactory;
         private readonly ILogger<IPAddressComProvider> logger;
         private readonly Uri lookupUri = new("https://www.ipaddress.com/ip-lookup");
 
@@ -34,7 +34,7 @@ namespace FastGithub.Scanner.DomainAddressProviders
         /// <param name="logger"></param>
         public IPAddressComProvider(
             IOptionsMonitor<GithubOptions> options,
-            HttpClientFactory httpClientFactory,
+            IHttpClientFactory httpClientFactory,
             ILogger<IPAddressComProvider> logger)
         {
             this.options = options;
@@ -54,7 +54,7 @@ namespace FastGithub.Scanner.DomainAddressProviders
                 return Enumerable.Empty<DomainAddress>();
             }
 
-            using var httpClient = this.httpClientFactory.Create();
+            var httpClient = this.httpClientFactory.CreateClient(nameof(FastGithub));
             var result = new HashSet<DomainAddress>();
             foreach (var domain in setting.Domains)
             {

+ 2 - 1
FastGithub.Scanner/FastGithub.Scanner.csproj

@@ -8,7 +8,8 @@
 	<ItemGroup>
 		<PackageReference Include="DNS" Version="6.1.0" />
 		<PackageReference Include="IPNetwork2" Version="2.5.320" />
-		<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" /> 
+		<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
+		<PackageReference Include="Microsoft.Extensions.Http" Version="5.0.0" /> 
 	</ItemGroup>
 
 	<ItemGroup>

+ 0 - 41
FastGithub.Scanner/HttpClientFactory.cs

@@ -1,41 +0,0 @@
-using Microsoft.Extensions.DependencyInjection;
-using System.Net.Http;
-using System.Net.Http.Headers;
-using System.Reflection;
-
-namespace FastGithub.Scanner
-{
-    /// <summary>
-    /// HttpClient工厂
-    /// </summary>
-    [Service(ServiceLifetime.Singleton)]
-    sealed class HttpClientFactory
-    {
-        /// <summary>
-        /// 程序集版本信息
-        /// </summary>
-        private static readonly AssemblyName assemblyName = typeof(HttpClientFactory).Assembly.GetName();
-
-        /// <summary>
-        /// 请求头的默认UserAgent
-        /// </summary>
-        private readonly static ProductInfoHeaderValue defaultUserAgent = new(assemblyName.Name ?? "FastGithub", assemblyName.Version?.ToString());
-
-        /// <summary>
-        /// 创建httpClient
-        /// </summary>
-        /// <returns></returns>
-        public HttpClient Create(bool allowAutoRedirect = true)
-        {
-            var httpClient = new HttpClient(new HttpClientHandler
-            {
-                Proxy = null,
-                UseProxy = false,
-                AllowAutoRedirect = allowAutoRedirect
-            });
-            httpClient.DefaultRequestHeaders.Accept.TryParseAdd("*/*");
-            httpClient.DefaultRequestHeaders.UserAgent.Add(defaultUserAgent);
-            return httpClient;
-        }
-    }
-}

+ 7 - 8
FastGithub.Scanner/ScanMiddlewares/HttpsScanMiddleware.cs

@@ -18,7 +18,7 @@ namespace FastGithub.Scanner.ScanMiddlewares
     sealed class HttpsScanMiddleware : IMiddleware<GithubContext>
     {
         private readonly IOptionsMonitor<GithubOptions> options;
-        private readonly HttpClientFactory httpClientFactory;
+        private readonly IHttpClientFactory httpClientFactory;
         private readonly ILogger<HttpsScanMiddleware> logger;
 
         /// <summary>
@@ -28,7 +28,7 @@ namespace FastGithub.Scanner.ScanMiddlewares
         /// <param name="logger"></param>
         public HttpsScanMiddleware(
             IOptionsMonitor<GithubOptions> options,
-            HttpClientFactory httpClientFactory,
+            IHttpClientFactory httpClientFactory,
             ILogger<HttpsScanMiddleware> logger)
         {
             this.options = options;
@@ -53,15 +53,14 @@ namespace FastGithub.Scanner.ScanMiddlewares
                     Method = HttpMethod.Head,
                     RequestUri = new Uri($"https://{context.Address}"),
                 };
-                request.Headers.Host = context.Domain;
-                request.Headers.ConnectionClose = true;
+                request.Headers.Host = context.Domain; 
 
                 var timeout = this.options.CurrentValue.Scan.HttpsScanTimeout;
                 using var cancellationTokenSource = new CancellationTokenSource(timeout);
-                using var httpClient = this.httpClientFactory.Create(allowAutoRedirect: false);
+                var httpClient = this.httpClientFactory.CreateClient(nameof(FastGithub));
                 using var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationTokenSource.Token);
 
-                this.VerifyHttpsResponse(context.Domain, response);
+                VerifyHttpsResponse(context.Domain, response);
                 context.Available = true;
 
                 await next();
@@ -84,7 +83,7 @@ namespace FastGithub.Scanner.ScanMiddlewares
         /// <param name="response"></param>
         /// <exception cref="HttpRequestException"></exception>
         /// <exception cref="ValidationException"></exception>
-        private void VerifyHttpsResponse(string domain, HttpResponseMessage response)
+        private static void VerifyHttpsResponse(string domain, HttpResponseMessage response)
         {
             response.EnsureSuccessStatusCode();
 
@@ -103,7 +102,7 @@ namespace FastGithub.Scanner.ScanMiddlewares
             }
         }
 
-        private string GetInnerMessage(Exception ex)
+        private static string GetInnerMessage(Exception ex)
         {
             while (ex.InnerException != null)
             {

+ 21 - 1
FastGithub.Scanner/ScannerServiceCollectionExtensions.cs

@@ -1,6 +1,9 @@
 using FastGithub.Scanner;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Net.Http;
+using System.Net.Http.Headers;
 
 namespace FastGithub
 {
@@ -18,7 +21,24 @@ namespace FastGithub
         public static IServiceCollection AddGithubScanner(this IServiceCollection services, IConfiguration configuration)
         {
             var assembly = typeof(ScannerServiceCollectionExtensions).Assembly;
-            return services 
+            var defaultUserAgent = new ProductInfoHeaderValue(assembly.GetName().Name ?? nameof(FastGithub), assembly.GetName().Version?.ToString());
+
+            services
+                .AddHttpClient(nameof(FastGithub))
+                .SetHandlerLifetime(TimeSpan.FromMinutes(10d))
+                .ConfigureHttpClient(httpClient =>
+                {
+                    httpClient.DefaultRequestHeaders.Accept.TryParseAdd("*/*");
+                    httpClient.DefaultRequestHeaders.UserAgent.Add(defaultUserAgent);
+                })
+                .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
+                {
+                    Proxy = null,
+                    UseProxy = false,
+                    AllowAutoRedirect = false
+                });
+
+            return services
                 .AddServiceAndOptions(assembly, configuration)
                 .AddHostedService<GithubFullScanHostedService>()
                 .AddHostedService<GithubResultScanHostedService>()