Приложение 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 не очень хорошо останавливается, когда одновременно выполняется большое количество запросов. Может быть, какой-то сигнал теряется? Во время нормальной работы все объекты правильно очищены или иным образом утилизированы.
С уважением,