我有一个API,其中包含一个HostedService,使用VS2022和.Net 6构建。
当我在本地运行服务时,一切都按预期调用并正常工作,但是当部署后,服务似乎无法启动。
我尝试了许多不同的配置,甚至尝试使用后台服务,但结果都相同。以下是我的代码:
我有一个现有的应用程序,在VS2019中构建为.Net Core 3.1,其中包含一个HostedService,并且正常工作。 我注意到,当我将我的.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配置)的限制。 - sellotapeIHostedService
相当通用;您也可以通过其他方式进行托管;例如Windows服务(非常容易)。 - sellotape