2
0

ScannerServiceCollectionExtensions.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using FastGithub.Scanner;
  2. using Microsoft.Extensions.Configuration;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using System;
  5. using System.Net.Http;
  6. using System.Net.Http.Headers;
  7. using System.Net.Security;
  8. using System.Net.Sockets;
  9. namespace FastGithub
  10. {
  11. /// <summary>
  12. /// 服务注册扩展
  13. /// </summary>
  14. public static class ScannerServiceCollectionExtensions
  15. {
  16. /// <summary>
  17. /// 注册程序集下所有服务下选项
  18. /// </summary>
  19. /// <param name="services"></param>
  20. /// <param name="configuration">配置</param>
  21. /// <returns></returns>
  22. public static IServiceCollection AddGithubScanner(this IServiceCollection services, IConfiguration configuration)
  23. {
  24. var assembly = typeof(ScannerServiceCollectionExtensions).Assembly;
  25. var defaultUserAgent = new ProductInfoHeaderValue(assembly.GetName().Name ?? nameof(FastGithub), assembly.GetName().Version?.ToString());
  26. services
  27. .AddHttpClient(nameof(FastGithub))
  28. .SetHandlerLifetime(TimeSpan.FromMinutes(5d))
  29. .ConfigureHttpClient(httpClient =>
  30. {
  31. httpClient.DefaultRequestHeaders.Accept.TryParseAdd("*/*");
  32. httpClient.DefaultRequestHeaders.UserAgent.Add(defaultUserAgent);
  33. })
  34. .ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler
  35. {
  36. Proxy = null,
  37. UseProxy = false,
  38. AllowAutoRedirect = false,
  39. ConnectCallback = async (ctx, ct) =>
  40. {
  41. var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
  42. await socket.ConnectAsync(ctx.DnsEndPoint, ct);
  43. var stream = new NetworkStream(socket, ownsSocket: true);
  44. if (ctx.InitialRequestMessage.Headers.Host == null)
  45. {
  46. return stream;
  47. }
  48. var sslStream = new SslStream(stream, leaveInnerStreamOpen: false, delegate { return true; });
  49. await sslStream.AuthenticateAsClientAsync(string.Empty, null, false);
  50. return sslStream;
  51. }
  52. })
  53. .AddHttpMessageHandler<GithubDnsHttpHandler>();
  54. return services
  55. .AddMemoryCache()
  56. .AddServiceAndOptions(assembly, configuration)
  57. .AddHostedService<GithubFullScanHostedService>()
  58. .AddHostedService<GithubResultScanHostedService>()
  59. .AddSingleton<IGithubScanResults>(appService => appService.GetRequiredService<GithubScanResults>());
  60. ;
  61. }
  62. }
  63. }