2
0

DnsInterceptHostedService.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Microsoft.Extensions.Hosting;
  2. using Microsoft.Extensions.Logging;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Runtime.Versioning;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace FastGithub.PacketIntercept
  10. {
  11. /// <summary>
  12. /// dns拦截后台服务
  13. /// </summary>
  14. [SupportedOSPlatform("windows")]
  15. sealed class DnsInterceptHostedService : BackgroundService
  16. {
  17. private readonly IDnsInterceptor dnsInterceptor;
  18. private readonly IEnumerable<IDnsConflictSolver> conflictSolvers;
  19. private readonly ILogger<DnsInterceptHostedService> logger;
  20. private readonly IHost host;
  21. /// <summary>
  22. /// dns拦截后台服务
  23. /// </summary>
  24. /// <param name="dnsInterceptor"></param>
  25. /// <param name="conflictSolvers"></param>
  26. /// <param name="logger"></param>
  27. /// <param name="host"></param>
  28. public DnsInterceptHostedService(
  29. IDnsInterceptor dnsInterceptor,
  30. IEnumerable<IDnsConflictSolver> conflictSolvers,
  31. ILogger<DnsInterceptHostedService> logger,
  32. IHost host)
  33. {
  34. this.dnsInterceptor = dnsInterceptor;
  35. this.conflictSolvers = conflictSolvers;
  36. this.logger = logger;
  37. this.host = host;
  38. }
  39. /// <summary>
  40. /// 启动时处理冲突
  41. /// </summary>
  42. /// <param name="cancellationToken"></param>
  43. /// <returns></returns>
  44. public override async Task StartAsync(CancellationToken cancellationToken)
  45. {
  46. foreach (var solver in this.conflictSolvers)
  47. {
  48. await solver.SolveAsync(cancellationToken);
  49. }
  50. await base.StartAsync(cancellationToken);
  51. }
  52. /// <summary>
  53. /// 停止时恢复冲突
  54. /// </summary>
  55. /// <param name="cancellationToken"></param>
  56. /// <returns></returns>
  57. public override async Task StopAsync(CancellationToken cancellationToken)
  58. {
  59. foreach (var solver in this.conflictSolvers)
  60. {
  61. await solver.RestoreAsync(cancellationToken);
  62. }
  63. await base.StopAsync(cancellationToken);
  64. }
  65. /// <summary>
  66. /// dns后台
  67. /// </summary>
  68. /// <param name="stoppingToken"></param>
  69. /// <returns></returns>
  70. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  71. {
  72. try
  73. {
  74. await this.dnsInterceptor.InterceptAsync(stoppingToken);
  75. }
  76. catch (OperationCanceledException)
  77. {
  78. }
  79. catch (Win32Exception ex) when (ex.NativeErrorCode == 995)
  80. {
  81. }
  82. catch (Exception ex)
  83. {
  84. this.logger.LogError(ex, "dns拦截器异常");
  85. await this.host.StopAsync(stoppingToken);
  86. }
  87. }
  88. }
  89. }