簡體   English   中英

IHostedService .NET 6 部署時未啟動

[英]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 設置解決了它:

  • 在“頁面”高級設置下:“預加載啟用”必須設置為“真”(這會強制應用程序在每次應用程序池回收后和啟動時運行)
  • 在“App Pool”高級設置下:“啟動模式”必須設置為“AlwaysRunning”
  • IIS 中的“頁面”必須允許 http(因為啟用預加載僅適用於 http 而不是通過 https)

問題是,雖然 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM