web-dev-qa-db-ja.com

ホストされたサービスをASPネットコア3.1で存続させる方法は?

お元気ですか?。

私はネットコア3.1にWeb APIを持っています。これには、データの移行を実行するためにX分ごとに実行する必要があるサービスが含まれています(テストしているだけです)が、2つの問題があります。

  1. サービスを実行するには、まずAPIのURLを実行する必要があります。問題は、APIを実行せずに、このサービスを自動的に開始するにはどうすればよいですか?
  2. 数分間APIの使用を停止すると、サービスが機能しなくなります。問題は、「Forever」サービスを存続させるにはどうすればよいですか。

私のWeb APIは、IISのすべての機能にアクセスできないWebホスティングでホストされていることを強調する必要があります

これは私のコードであり、事前に私はあなたの助けに感謝します。

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

実装されたBackgroundServiceではなくIHostedServiceから継承します。これにより、サービスの開始、実行、停止の機構が処理されます。

ただし、直面している問題は、IISがサービスの最初のリクエストまでc#プロセスを開始しないことです。その後、デフォルトのアプリケーションプール設定は、リクエストがない場合に再びシャットダウンします。定期的にタスクを設定して、定期的にURLをリクエストし、サービスが実行されていることを監視することをお勧めします。サービスが停止した場合に通知を受け取りますか?

0
Jeremy Lakeman