asp. net core: Как лучше всего выполнять код в контейнерном приложении для кубернетов? - PullRequest
0 голосов
/ 04 августа 2020

Я создал приложение-контейнер для шаблона проекта kubernetes. Я хочу запустить там службу, которая слушает сообщения и работает в бесконечном l oop. Исполняю из Configure метода Startup.cs. Судя по некоторым ссылкам, это место для этого. Перед этим я регистрирую все службы в методе ConfigureServices, как обычное приложение asp. net. Кроме того, я хочу использовать IApplicationLifetime.ApplicationStopping для запуска. Я не нашел способа достичь обоих: выполнить код слушателя задач и управлять обратным вызовом ApplicationStopping. это мой Configure метод

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            var cancellationToken = new CancellationTokenSource();
            var tasksListener = app.ApplicationServices.GetRequiredService<ITaskListener>();
            var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
            appLifetime.ApplicationStopping.Register(() =>
            {
                Console.WriteLine("ApplicationStopping is stopping");
            });
            tasksListener.Listen(cancellationToken.Token).Wait();
            app.Run(async (context) =>
            {
                await tasksListener.Listen(cancellationToken.Token);
            });
        }

Я могу остановить приложение и увидеть печать, но код внутри app.Run не выполняется. Если я переключу этот код:

            app.Run(async (context) =>
            {
                await tasksListener.Listen(cancellationToken.Token);
            });

на это:

                tasksListener.Listen(cancellationToken.Token).Wait();

, код будет выполнен, но тогда IApplicationLifetime.ApplicationStopping не будет выполняться. Есть идеи?

1 Ответ

1 голос
/ 10 августа 2020

для тех, кто сталкивается с той же проблемой, я сообщу, что решение для меня было просто удалить Startup.cs и сделать все из Program.cs, поэтому оно будет выглядеть так:

    public class Program
    {
        public static void Main(string[] args)
        {
            IWorker worker = new Worker();
            CancellationTokenSource cancellationToken = new CancellationTokenSource();
            CreateWebHostBuilder(args, worker, cancellationToken).Build().RunAsync();
            worker.Work(cancellationToken.Token).Wait();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args, IWorker worker, CancellationTokenSource cancellationToken) =>
            WebHost.CreateDefaultBuilder(args)
            .Configure((app) =>
            {
                var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
                appLifetime.GracefullyTerminate(worker, cancellationToken);
            });
    }

то, что я нашел Out состоит в том, что Startup.cs подходит для реализации службы приложений, которые получают звонки извне. app.Run указывает на то, что произойдет, когда придет запрос.

Кроме того, Microsoft запустила в. net core 3.0 шаблон проекта Worker Service, который точно подходит для этой цели. Вы можете найти ссылку здесь https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio

...