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;
    }

Ответы (0 шт):