瀏覽代碼

缓存tcp扫描结果

xljiulang 4 年之前
父節點
當前提交
01fac4fcb8

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

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

+ 33 - 4
FastGithub.Scanner/ScanMiddlewares/TcpScanMiddleware.cs

@@ -1,4 +1,5 @@
-using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;
 using System;
@@ -15,7 +16,9 @@ namespace FastGithub.Scanner.ScanMiddlewares
     sealed class TcpScanMiddleware : IMiddleware<GithubContext>
     {
         private const int PORT = 443;
+        private readonly TimeSpan cacheTimeSpan = TimeSpan.FromMinutes(20d);
         private readonly IOptionsMonitor<GithubOptions> options;
+        private readonly IMemoryCache memoryCache;
         private readonly ILogger<TcpScanMiddleware> logger;
 
         /// <summary>
@@ -25,9 +28,11 @@ namespace FastGithub.Scanner.ScanMiddlewares
         /// <param name="logger"></param>
         public TcpScanMiddleware(
             IOptionsMonitor<GithubOptions> options,
+            IMemoryCache memoryCache,
             ILogger<TcpScanMiddleware> logger)
         {
             this.options = options;
+            this.memoryCache = memoryCache;
             this.logger = logger;
         }
 
@@ -38,6 +43,31 @@ namespace FastGithub.Scanner.ScanMiddlewares
         /// <param name="next"></param>
         /// <returns></returns>
         public async Task InvokeAsync(GithubContext context, Func<Task> next)
+        {
+            var key = $"tcp://{context.Address}";
+            if (this.memoryCache.TryGetValue<bool>(key, out var available) == false)
+            {
+                available = await this.TcpScanAsync(context);
+                this.memoryCache.Set(key, available, cacheTimeSpan);
+            }
+
+            if (available == true)
+            {
+                await next();
+            }
+            else
+            {
+                this.logger.LogTrace($"{context.Domain} {context.Address}的{PORT}端口未开放");
+            }
+        }
+
+
+        /// <summary>
+        /// tcp扫描
+        /// </summary>
+        /// <param name="context"></param>
+        /// <returns></returns>
+        private async Task<bool> TcpScanAsync(GithubContext context)
         {
             try
             {
@@ -45,12 +75,11 @@ namespace FastGithub.Scanner.ScanMiddlewares
                 var timeout = this.options.CurrentValue.Scan.TcpScanTimeout;
                 using var cancellationTokenSource = new CancellationTokenSource(timeout);
                 await socket.ConnectAsync(context.Address, PORT, cancellationTokenSource.Token);
-
-                await next();
+                return true;
             }
             catch (Exception)
             {
-                this.logger.LogTrace($"{context.Domain} {context.Address}的{PORT}端口未开放");
+                return false;
             }
         }
     }

+ 1 - 0
FastGithub.Scanner/ScannerServiceCollectionExtensions.cs

@@ -39,6 +39,7 @@ namespace FastGithub
                 });
 
             return services
+                .AddMemoryCache()
                 .AddServiceAndOptions(assembly, configuration)
                 .AddHostedService<GithubFullScanHostedService>()
                 .AddHostedService<GithubResultScanHostedService>()