ihostdservice . net 6部署时未启动



我有一个包含hostdservice的API,它是用。net 6在VS2022中构建的。

当我在本地运行时,服务按预期调用,一切正常,但当部署时,服务似乎没有启动。

我尝试了许多不同的配置,甚至尝试使用后台服务,但它都有相同的结果。下面是我的代码:

我有一个现有的应用程序在VS2019 . net Core 3.1中构建,它有一个hostdservice并且工作良好。我注意到,当我将。net Core应用程序转换为。net 6时,该服务在我部署时没有启动,所以我决定只是构建一个小应用程序,试图找到导致问题的原因。

Program.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();
}

}
}

在本地运行正常,但当我部署它时,服务似乎没有启动,没有生成日志文件,我似乎找不到任何错误报告。

任何想法?

问题是IHostedService在网站启动时启动,IIS何时启动网站?默认情况下,直到发出请求时才会显示。如果您的站点空闲了一段时间,IIS也会杀死线程。

IIS有一个可以启用的特性,叫做"应用程序初始化"。然后您需要将应用程序池配置为始终启动(startMode="AlwaysRunning")。

最后,将站点的应用程序配置为预加载,它在启动时向站点发送一个虚假的HTTP请求(preloadEnabled="true")。

相关文档在这里:https://learn.microsoft.com/en-us/iis/get-started/whats-new-in-iis-8/iis-80-application-initialization

我们遇到了同样的问题,并通过以下IIS设置解决了它:

  • 在"Page"高级设置:"Preload enabled";必须设置为"true";(这迫使应用程序在每次应用程序池回收和启动后运行)
  • 应用程序池下;高级设置:"启动模式";必须设置为"AlwaysRunning">
  • "Page"在IIS中必须允许http(因为预加载启用只在http上工作,而不是通过https)

最新更新