繁体   English   中英

asp.net 核心:在 kube.netes 的容器应用程序中执行代码的最佳实践是什么

[英]asp.net core: What is the best practice to execute code in a container application for kubernetes

我为 kube.netes 项目模式创建了一个容器应用程序。 我想在那里运行一个服务来监听消息并在无限循环中工作。 我从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 不会被执行。 任何的想法?

对于那些遇到同样问题的人,我会更新我的解决方案只是删除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);
            });
    }

我发现Startup.cs适合实现从外部获取调用的应用程序服务。 app.Run 指的是请求到来时会发生什么。

此外,微软在 .net core 3.0 中推出了一个 Worker Service 项目模板,正好符合这个目的。 你可以在这里找到参考https://learn.microsoft.com/en-us/as.net/core/fundamentals/host/hosted-services?view=as.netcore-3.1&tabs=visual-studio

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM