web-dev-qa-db-fra.com

Comment maintenir un service hébergé en vie dans asp net core 3.1?

comment ça va?.

J'ai une API Web dans net core 3.1, elle contient à son tour un service que toutes les X minutes doivent exécuter pour effectuer des migrations de données (je ne fais que le tester), mais j'ai 2 problèmes.

  1. Pour que le service fonctionne, je dois d'abord exécuter une URL de mes API. La question est: Comment puis-je faire démarrer ce service automatiquement, sans avoir besoin d'exécuter une API?
  2. Lorsque j'arrête d'utiliser les API pendant quelques minutes, le service cesse de fonctionner. La question est: comment puis-je maintenir le service "Forever" en vie?

Je dois souligner que mon API Web est hébergée dans un hébergement Web, où je n'ai pas accès à toutes les fonctionnalités d'IIS

Ceci est mon code et j'apprécie à l'avance votre aide.

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
user8564782

Hérite de BackgroundService au lieu de IHostedService implémenté. Cela prendra en charge les machines de démarrage, de fonctionnement et d'arrêt de votre service pour vous.

Cependant, le problème auquel vous êtes confronté est que IIS ne démarre pas votre processus c # avant la première demande du service. Ensuite, les paramètres par défaut du pool d'applications le fermeront à nouveau s'il n'y a pas de demandes. Je vous suggère de configurer une sorte de tâche planifiée pour demander périodiquement une URL et surveiller que le service est en cours d'exécution. Vous voudrez être averti s'il s'arrête quand même, n'est-ce pas?

0
Jeremy Lakeman