Высокая нагрузка ASP. NET приложение работает как Windows Служба не останавливается - PullRequest
0 голосов
/ 16 апреля 2020

Приложение asp. net (работающее на Kestrel), работающее как служба Windows, не может остановить работу при высокой нагрузке.

Настройка:

[...]

    var config = WebHostBuilderHelper.GetConfig();

            var hostBuilder = new WebHostBuilder().UseKestrel(options => options.ConfigureEndpoints())
                                                  .UseConfiguration(config)
                                                  .UseStartup<Startup>()
                                                  .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
                                                  .UseContentRoot(AppDomain.CurrentDomain.BaseDirectory);

            if (Debugger.IsAttached || args.ToList()
                                           .Contains("console"))
            {
                var host = hostBuilder.Build();

                host.Run();
            }
            else
            {
                var host = hostBuilder.UseContentRoot(pathToContentRoot)
                                      .Build();

                host.RunAsCustomService();
            }

RunAsCustomService :

    public static class WebHostServiceExtensions
    {
        public static void RunAsCustomService(this IWebHost host)
        {
            var webHostService = new CustomWebHostService(host);
            ServiceBase.Run(webHostService);
        }
    }
internal class CustomWebHostService : WebHostService
    {
        private ILogger _logger;

        public CustomWebHostService(IWebHost host) : base(host)
        {
            Console.Write("CustomWebHostService start");
            _logger = host.Services
                          .GetRequiredService<ILogger<CustomWebHostService>>();
        }
[...]
    }

При остановке службы он правильно получает стоп-сигнал от Windows (может быть проверено как журналами, так и подключенным отладчиком) - и корректно останавливается очень быстро, когда нет под нагрузкой. Во время OnStop (); StopAsyn c () вызывается на хосте, а затем, в конце концов, удаляется. Я предполагаю, что StopAsyn c не очень хорошо останавливается, когда одновременно выполняется большое количество запросов. Может быть, какой-то сигнал теряется? Во время нормальной работы все объекты правильно очищены или иным образом утилизированы.

С уважением,

...