Как сохранить работающий сервис в asp net core 3.1? - PullRequest
1 голос
/ 06 февраля 2020

как дела?

У меня есть веб-API в net ядре 3.1, он, в свою очередь, содержит сервис, который должен запускаться каждые X минут для выполнения миграции данных (я просто тестирую его ), но у меня есть 2 проблемы.

  1. Чтобы служба работала, я должен сначала запустить URL моего apis. Вопрос в том, как сделать так, чтобы эта служба запускалась автоматически, без необходимости запускать API?
  2. Когда я прекращаю использовать API на несколько минут, служба перестает работать. Вопрос в том, как мне сохранить службу «Навсегда»?

Я должен подчеркнуть, что мой веб-интерфейс размещен на веб-хостинге, где у меня нет доступа ко всем функциям IIS.

Это мой код, и заранее благодарю за помощь.

MySuperService.cs

 public class MySuperService : IHostedService, IDisposable
{
    private bool _stopping;
    private Task _backgroundTask;
    private static readonly log4net.ILog log =log4net.LogManager.GetLogger(typeof(MySuperService));
    public Task StartAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("MySuperService is starting.");
        log.Info("MySuperService is starting.");
        _backgroundTask = BackgroundTask();
        return Task.CompletedTask;
    }

    private async Task BackgroundTask()
    {
        int contador = 1;
        while (!_stopping)
        {
            Console.WriteLine("MySuperService is working--> " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            log.Info("MySuperService is working--> " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            await Task.Delay(TimeSpan.FromMinutes(3));
            contador++;
        }

        Console.WriteLine("MySuperService background task is stopping.");
        log.Info("MySuperService background task is stopping.");
    }

    public async Task StopAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("MySuperService is stopping.");
        log.Info("MySuperService is stopping.");
        _stopping = true;
        if (_backgroundTask != null)
        {
            // TODO: cancellation
            await BackgroundTask();
            //await _backgroundTask;
        }
    }

    public void Dispose()
    {
        Console.WriteLine("MySuperService is disposing.");
        log.Info("MySuperService is disposing.");
    }
}

Program.cs

public class Program
{
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
    public static void Main(string[] args)
    {
        ...
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            }).ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<MySuperService>();
            });
}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.0&tabs=visual-studio

Если вы унаследовали свой сервис бесконечной работы от класса BackgroundService и внедрили свой логический c внутри al oop и необходимые

await Task.Delay(TimeSpan.FromMinutes(x miutes))

задание будет запущено, как только приложение запустится без вызова API, и остановится, когда приложение остановится.

 public class MyService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine("test");

            //await run job

            await Task.Delay(TimeSpan.FromSeconds(1));
        }
    }

    public override async Task StartAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("start");

        await ExecuteAsync(cancellationToken);
    }

    public override Task StopAsync(CancellationToken cancellationToken)
    {
        Console.WriteLine("stop");

        return Task.CompletedTask;
    }
}
0 голосов
/ 06 февраля 2020

Наследовать от BackgroundService вместо реализованного IHostedService. Это позаботится о механизме запуска, запуска и остановки службы для вас.

Однако проблема, с которой вы сталкиваетесь, заключается в том, что IIS не запускает ваш c# процесс до первого запроса службы. Тогда настройки пула приложений по умолчанию отключат его снова, если нет запросов. Я бы предложил настроить какое-то запланированное задание, чтобы периодически запрашивать URL и отслеживать, что служба работает. Вы хотите получать уведомления, если он все равно останавливается, верно?

...