![](/img/trans.png)
[英]IHostedService mirgrated from .Net Core 3.1 to .Net 6 stops working
[英]IHostedService .NET 6 not starting when deployed
我有一個 API,其中包含一個使用 .Net 6 在 VS2022 中構建的 HostedService。
當我在本地運行時,該服務按預期被調用並且一切正常,但是當部署時,該服務似乎沒有啟動。
我嘗試了許多不同的配置,甚至嘗試使用后台服務,但結果都是一樣的。 這是我的代碼:
我有一個在 VS2019.Net Core 3.1 中構建的現有應用程序,它有一個 HostedService 並且工作正常。 我注意到,當我將我的 .Net Core 應用程序轉換為 .Net 6 時,部署時服務沒有啟動,所以我決定只構建一個小應用程序來嘗試找出導致問題的原因。
程序.cs
using HostedServices.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseSerilog((context, loggerConfiguration) => loggerConfiguration
.ReadFrom.Configuration(context.Configuration)
.Enrich.FromLogContext()
.Enrich.WithMachineName());
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddHostedService<MainService>();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
這是托管服務
namespace HostedServices.Services
{
public class MainService : IHostedService, IDisposable
{
private int executionCount = 0;
private readonly ILogger<MainService> _logger;
private Timer _timer;
private Task _executingTask;
private readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource();
public MainService(ILogger<MainService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation($"Test Hosted Service Started {DateTime.Now}.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromMinutes(1));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_executingTask = DoWorkAsync(_stoppingCts.Token);
}
private async Task DoWorkAsync(CancellationToken token)
{
_logger.LogInformation(
"Doing work: {0}", DateTime.Now);
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
}
一切都在本地運行良好,但是當我部署它時,服務似乎沒有啟動,沒有生成日志文件,而且我似乎找不到任何報告的錯誤。
有任何想法嗎?
我們遇到了同樣的問題,並通過以下 IIS 設置解決了它:
問題是,雖然 IHostedService 在站點啟動時啟動,但 IIS 何時啟動站點? 默認情況下,它不會直到發出請求。 如果您的網站閑置了一段時間,IIS 也會終止該線程。
IIS 有一個可以啟用的功能,稱為“應用程序初始化”。 然后,您需要將應用程序池配置為始終啟動 (startMode="AlwaysRunning")。
最后,您將站點的應用程序配置為預加載,它會在啟動時向站點發送偽造的 HTTP 請求 (preloadEnabled="true")。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.