GithubHostedService.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using FastGithub.Middlewares;
  2. using Microsoft.Extensions.Hosting;
  3. using Microsoft.Extensions.Logging;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text.Json;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. namespace FastGithub
  12. {
  13. sealed class GithubHostedService : BackgroundService
  14. {
  15. private readonly GithubDelegate githubDelegate;
  16. private readonly ILogger<GithubHostedService> logger;
  17. public GithubHostedService(
  18. IServiceProvider appServiceProvider,
  19. ILogger<GithubHostedService> logger)
  20. {
  21. this.githubDelegate = new GithubBuilder(appServiceProvider, ctx => Task.CompletedTask)
  22. .Use<ConcurrentMiddleware>()
  23. .Use<PortScanMiddleware>()
  24. .Use<HttpTestMiddleware>()
  25. .Build();
  26. this.logger = logger;
  27. }
  28. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  29. {
  30. using var stream = File.OpenRead("meta.json");
  31. var meta = await JsonSerializer.DeserializeAsync<Meta>(stream, cancellationToken: stoppingToken);
  32. if (meta != null)
  33. {
  34. var contexts = new List<GithubContext>();
  35. var tasks = this.GetScanTasks(meta, contexts);
  36. await Task.WhenAll(tasks);
  37. var orderByContexts = contexts
  38. .Where(item => item.HttpElapsed != null)
  39. .OrderBy(item => item.HttpElapsed);
  40. foreach (var context in orderByContexts)
  41. {
  42. this.logger.LogInformation($"{context.Address} {context.HttpElapsed}");
  43. }
  44. }
  45. this.logger.LogInformation("扫描结束");
  46. }
  47. private IEnumerable<Task> GetScanTasks(Meta meta, IList<GithubContext> contexts)
  48. {
  49. foreach (var address in meta.ToIPv4Address())
  50. {
  51. var context = new GithubContext
  52. {
  53. Address = address,
  54. };
  55. contexts.Add(context);
  56. yield return this.githubDelegate(context);
  57. }
  58. }
  59. }
  60. }