[英]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.