ASP.NET Core приложение выключается
У меня есть приложение ASP.Net Core. При запуске в IIS 7.5 происходит shutwodn IHostedService. Если приложение просто запустить из командной строки - все работает хорошо. В логах info: CronJobUpdateCA[0]
08:50:00 CronJob is working.
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
dbug: Microsoft.Extensions.Hosting.Internal.Host[3]
В Event Log Hosting stopping Получено сообщение ISAPI о неполадках рабочего процесса. Рабочий процесс с идентификатором процесса "12008", обслуживающий пул приложений "UpdaterCA2", запросил повторный запуск.
Так же методом выявления места, обнаружил, что сервис завершает работу, когда идет обращение к контексту БД (sqlite локальная) var item = context.CA.Where(x => x.Id == ca.РеестровыйНомер).FirstOrDefault();
Если закоментировать эту строку - сервис работает.
На всякий случай приведу код сервиса.
BackgroundService.cs
public abstract class BackgroundService : IHostedService
{
private Task _executingTask;
private readonly CancellationTokenSource _stoppingCts =
new CancellationTokenSource();
public virtual Task StartAsync(CancellationToken cancellationToken)
{
_executingTask = ExecuteAsync(_stoppingCts.Token);
if (_executingTask.IsCompleted)
{
return _executingTask;
}
// Otherwise it's running
return Task.CompletedTask;
}
public virtual async Task StopAsync(CancellationToken cancellationToken)
{
// Stop called without start
if (_executingTask == null)
{
return;
}
try
{
_stoppingCts.Cancel();
}
finally
{
await Task.WhenAny(_executingTask, Task.Delay(5000,
cancellationToken));
}
}
protected virtual async Task ExecuteAsync(CancellationToken stoppingToken)
{
do
{
await Process();
await Task.Delay(30000, stoppingToken); //5 seconds delay
}
while (!stoppingToken.IsCancellationRequested);
}
protected abstract Task Process();
}
ScopedProcessor.cs
public abstract class ScopedProcessor : BackgroundService
{
private readonly IServiceScopeFactory _serviceScopeFactory;
public ScopedProcessor(IServiceScopeFactory serviceScopeFactory) : base()
{
_serviceScopeFactory = serviceScopeFactory;
}
protected override async Task Process()
{
using (var scope = _serviceScopeFactory.CreateScope())
{
await ProcessInScope(scope.ServiceProvider);
}
}
public abstract Task ProcessInScope(IServiceProvider serviceProvider);
}
SchedulerProcessor.cs
public abstract class ScheduledProcessor : ScopedProcessor
{
private CrontabSchedule _schedule;
private DateTime _nextRun;
protected abstract string Schedule { get; }
public ScheduledProcessor(IServiceScopeFactory serviceScopeFactory) : base(serviceScopeFactory)
{
_schedule = CrontabSchedule.Parse(Schedule);
_nextRun = _schedule.GetNextOccurrence(DateTime.Now);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
do
{
var now = DateTime.Now;
if (now > _nextRun)
{
await Process();
_nextRun = _schedule.GetNextOccurrence(DateTime.Now);
}
await Task.Delay(5000, stoppingToken); //5 seconds delay
}
while (!stoppingToken.IsCancellationRequested);
}
}
SchedulerTask.cs
public class ScheduleTask : ScheduledProcessor
{
private readonly IConfiguration _configuration;
public ScheduleTask(IServiceScopeFactory serviceScopeFactory, IConfiguration configuration) : base(serviceScopeFactory)
{
_configuration = configuration;
}
protected override string Schedule => "*/2 * * * *";
public override Task ProcessInScope(IServiceProvider serviceProvider)
{
var updater = new CAUpdeter(_configuration);
updater.Test();
return Task.CompletedTask;
}