WorkerProgram.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using CompServ.Worker;
  2. using Microsoft.AspNetCore.Builder;
  3. using Microsoft.AspNetCore.Hosting;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.AspNetCore.Server.Kestrel.Core;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using Microsoft.Extensions.Hosting;
  8. using Microsoft.Extensions.Logging;
  9. using Microsoft.Extensions.Logging.Console;
  10. using System;
  11. using CompServ.ClientLibrary;
  12. using Microsoft.AspNetCore.Hosting.Server.Features;
  13. using Microsoft.AspNetCore.Hosting.Server;
  14. using Microsoft.AspNetCore.Http.Features;
  15. using System.Net;
  16. if (args.Length > 0)
  17. {
  18. StatusHolder.HubServer = args[0];
  19. if (args.Length > 1 && int.TryParse(args[1], out var ratioArg) && ratioArg > 1) StatusHolder.Ratio = ratioArg;
  20. }
  21. var builder = WebApplication.CreateBuilder(args);
  22. //控制台日志格式
  23. builder.Services.AddLogging(opt =>
  24. {
  25. opt.AddSimpleConsole(p =>
  26. {
  27. p.TimestampFormat = "[dd HH:mm:ss] ";
  28. p.SingleLine = true;
  29. p.ColorBehavior = LoggerColorBehavior.Enabled;
  30. });
  31. });
  32. builder.Services.Configure<LoggerFilterOptions>(options =>
  33. {
  34. options.AddFilter((category, level) =>
  35. {
  36. if (level == LogLevel.Debug) return false;
  37. if (level == LogLevel.Trace) return false;
  38. if (category == "Microsoft.AspNetCore.Hosting.Diagnostics" && level == LogLevel.Information) return false;
  39. if (category == "Microsoft.AspNetCore.Routing.EndpointMiddleware" && level == LogLevel.Information) return false;
  40. if (category == "Microsoft.AspNetCore.Server.Kestrel" && level == LogLevel.Information) return false;
  41. if (category == "Microsoft.AspNetCore.Server.Kestrel.Http2" && level == LogLevel.Information) return false;
  42. if (category == "Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker" && level == LogLevel.Information) return false;
  43. if (category == "Microsoft.AspNetCore.Mvc.Infrastructure.ContentResultExecutor" && level == LogLevel.Information) return false;
  44. if (category == "Microsoft.AspNetCore.Mvc.Infrastructure.FileStreamResultExecutor" && level == LogLevel.Information) return false;
  45. return true; // 其他日志保留
  46. });
  47. });
  48. //配置HTTP1、HTTP2端口
  49. builder.WebHost.UseKestrel((_, kso) =>
  50. {
  51. kso.Listen(new IPEndPoint(IPAddress.Any, 0), lo => lo.Protocols = HttpProtocols.Http2);
  52. kso.Listen(new IPEndPoint(IPAddress.Any, 0), lo => lo.Protocols = HttpProtocols.Http1);
  53. });
  54. builder.Services.Configure<KestrelServerOptions>(options =>
  55. {
  56. options.Limits.MaxRequestBodySize = 100 * 1024 * 1024; // 设置最大请求体大小 100MB
  57. });
  58. try
  59. {
  60. Console.Title = "...";
  61. builder.Services.AddHostedService<ConsoleTitleUpdateService>();
  62. }
  63. catch
  64. {
  65. //EAT ERR
  66. }
  67. if (StatusHolder.HubServer != null) builder.Services.AddSingleton<HubRegister>();
  68. builder.Services.AddControllers();
  69. var app = builder.Build();
  70. app.Use(async (context, next) =>
  71. {
  72. context.Request.EnableBuffering(); // this used to be EnableRewind
  73. await next(context);
  74. });
  75. app.MapControllers();
  76. app.MapGet("/", () => "I am worker!");
  77. await app.StartAsync();
  78. // ↑↓ await app.RunAsync();
  79. {
  80. var logger = app.Services.GetRequiredService<ILogger<Program>>();
  81. logger.LogInformation("Self check...");
  82. var svr = app.Services.GetRequiredService<IServer>();
  83. var saf = svr.Features.GetRequiredFeature<IServerAddressesFeature>();
  84. var listeningPort = new Uri(saf.Addresses.First()).Port;
  85. tryAgain:
  86. var client = new CompServWorkerClient("http://127.0.0.1:" + listeningPort);
  87. var r = await client.CheckAliveAsync();
  88. if (r == false)
  89. {
  90. logger.LogWarning("Self check resunt: " + r + ", try again after 1 second");
  91. await Task.Delay(1000);
  92. goto tryAgain;
  93. }
  94. logger.LogInformation("Self check resunt: " + r);
  95. }
  96. var hubRegister = app.Services.GetService<HubRegister>();
  97. await (hubRegister?.Register() ?? Task.CompletedTask);
  98. await app.WaitForShutdownAsync();
  99. await (hubRegister?.UnRegister() ?? Task.CompletedTask);