web-dev-qa-db-ja.com

httpリクエストなしでMVCコアアプリでHostedServiceを開始する方法

私のMVC .NETコア2.2アプリには、バックグラウンド処理を行うHostedServiceがあります。

StartapクラスのConfigureServicesメソッドに登録されています

services.AddHostedService<Engines.KontolerTimer>();

これはユーザーのリクエストに依存しないバックグラウンドサービスであるため、アプリが起動したらすぐにバックグラウンドサービスを開始したいと思います。 HostedServiceが最初のユーザーリクエストの後に見つめるケースです。

MVCコアアプリの起動時にHostedServiceを起動する適切な方法は何ですか

私のサービスは次のようになります https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/Host/hosted-services?view=aspnetcore-2.2

internal class TimedHostedService : IHostedService, IDisposable
{
    private readonly ILogger _logger;
    private Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger)
    {
        _logger = logger;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is starting.");

        _timer = new Timer(DoWork, null, TimeSpan.Zero, 
            TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        _logger.LogInformation("Timed Background Service is working.");
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        _logger.LogInformation("Timed Background Service is stopping.");

        _timer?.Change(Timeout.Infinite, 0);

        return Task.CompletedTask;
    }

    public void Dispose()
    {
        _timer?.Dispose();
    }
}

アプリの起動に問題があるようです。

私のポーグラムcsは次のようになります

public class Program
    {
        public static void Main(string[] args)
        {
           CreateWebHostBuilder(args).Build().Run();


        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
            .UseStartup<Startup>();
    }

そして、最初のユーザー要求の前にブレークポイントに到達しません。私は何かを見逃していますか、これはVS2017によって作成されたデフォルトの.Net Coreアプリです

これが私のstarup.csです

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }
        private Models.Configuration.SerialPortConfiguration serialPortConfiguration;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));

            services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
                .AddDefaultUI(UIFramework.Bootstrap4)
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();

            services.AddDbContext<Data.Parking.parkingContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));


         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            services.AddHostedService<Engines.KontolerTimer>();}
12
adopilot

(古いWindowsサービスと同様に)バックグラウンドタスクを実行するサービスが必要な場合は、以下を使用することをお勧めします。 https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/Host/ generic-host?view = aspnetcore-2.2 WebHostの代わり。

WebHostは単純なバックグラウンドジョブのように見えるので、おそらく必要のない多くの要素を追加します(コードを読み取ることを前提としています)。

0
gatsby