DnscryptProxyHostedService.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using Microsoft.Extensions.Hosting;
  2. using Microsoft.Extensions.Logging;
  3. using System;
  4. using System.Diagnostics;
  5. using System.IO;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace FastGithub.ReverseProxy
  9. {
  10. /// <summary>
  11. /// DnscryptProxy后台服务
  12. /// </summary>
  13. sealed class DnscryptProxyHostedService : IHostedService
  14. {
  15. private const string dnscryptFile = "dnscrypt-proxy";
  16. private readonly ILogger<DnscryptProxyHostedService> logger;
  17. private Process? dnscryptProcess;
  18. /// <summary>
  19. /// DnscryptProxy后台服务
  20. /// </summary>
  21. /// <param name="logger"></param>
  22. public DnscryptProxyHostedService(ILogger<DnscryptProxyHostedService> logger)
  23. {
  24. this.logger = logger;
  25. }
  26. /// <summary>
  27. /// 启动dnscrypt-proxy
  28. /// </summary>
  29. /// <param name="cancellationToken"></param>
  30. /// <returns></returns>
  31. public Task StartAsync(CancellationToken cancellationToken)
  32. {
  33. try
  34. {
  35. var fileName = dnscryptFile;
  36. if (OperatingSystem.IsWindows())
  37. {
  38. fileName = $"{dnscryptFile}.exe";
  39. }
  40. if (File.Exists(fileName) == true)
  41. {
  42. this.dnscryptProcess = Process.Start(new ProcessStartInfo
  43. {
  44. FileName = fileName,
  45. UseShellExecute = true,
  46. CreateNoWindow = true,
  47. WindowStyle = ProcessWindowStyle.Hidden
  48. });
  49. this.logger.LogInformation($"{dnscryptFile}启动成功");
  50. }
  51. }
  52. catch (Exception ex)
  53. {
  54. this.logger.LogWarning($"{dnscryptFile}启动失败:{ex.Message}");
  55. }
  56. return Task.CompletedTask;
  57. }
  58. /// <summary>
  59. /// 停止dnscrypt-proxy
  60. /// </summary>
  61. /// <param name="cancellationToken"></param>
  62. /// <returns></returns>
  63. public Task StopAsync(CancellationToken cancellationToken)
  64. {
  65. if (this.dnscryptProcess != null)
  66. {
  67. this.dnscryptProcess.Kill();
  68. }
  69. return Task.CompletedTask;
  70. }
  71. }
  72. }