0

An asp.net application (running on Kestrel) running as a Windows Service has trouble stopping during high load.

The setup:

[...]

    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>>();
        }
[...]
    }

When stopping the service, it correctly receives the Stop-signal from Windows (can be verified by both logs and attaching debugger) -- and it correctly stops very quickly when not under load. During OnStop(); StopAsync() is called on the host, and then, eventually, it is disposed. I'm guessing the StopAsync does not stop very well when there are a large amount of requests being made to at the same time. Some signal being lost perhaps? During normal operation all objects are correctly cleaned up or otherwise disposed.

Best regards,

gwow12345
  • 311
  • 3
  • 12

0 Answers0