お元気ですか?。
私はネットコア3.1にWeb APIを持っています。これには、データの移行を実行するためにX分ごとに実行する必要があるサービスが含まれています(テストしているだけです)が、2つの問題があります。
私の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>();
});
}
実装されたBackgroundService
ではなくIHostedService
から継承します。これにより、サービスの開始、実行、停止の機構が処理されます。
ただし、直面している問題は、IISがサービスの最初のリクエストまでc#プロセスを開始しないことです。その後、デフォルトのアプリケーションプール設定は、リクエストがない場合に再びシャットダウンします。定期的にタスクを設定して、定期的にURLをリクエストし、サービスが実行されていることを監視することをお勧めします。サービスが停止した場合に通知を受け取りますか?