实施长 运行 服务(无限长/始终可用)以处理 ASP.NET 核心 Web Api 中的数据

Implementing a long running service (indefinite length / always available) to handle data in an ASP.NET Core Web Api

我将尝试简化它,

作为 ASP.NET Core Web Api (.Net Core 2.2) 的一部分,我正在努力实现无限期运行并处理比赛的出租车调度员后台服务 -> 将司机分配给比赛,不断获取该地区的新司机,并相应地从最近到最远分配给比赛(该服务读取和写入不同的 Sql 数据库表)。我将后台服务创建为托管服务,只要有可用的比赛,它就会执行上述所有操作,并在新的后台线程中处理每场比赛。 api 在 IIS 上的 ftp 服务器上运行。

问题: 一开始它工作正常,但有时服务会超时并且无法处理任何传入的比赛,我必须停止 api 和重新启动它,哎呀,这不是我想要的行为,因为我希望我的 xamarin-forms 应用程序能够响应并实时接收比赛。

在我编写服务后,我开始质疑我的实现,我遇到了像 后台工作者微服务Worker services..现在我更困惑于修复什么或如何解决问题,以及是否有更好的方法来解决这个问题。

我在 Web 中使用简洁的架构设计模式 Api。这就是我在 Program.cs 文件上注册后台服务的方式:

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureServices(services =>
                {
                    //Some workaround to use the hostedservice as an API
                    //see https://github.com/dotnet/extensions/issues/553
                    services.AddSingleton<BackgroundManagerService>();
                    services.AddSingleton<IHostedService>(p => p.GetService<BackgroundManagerService>());
                })
                .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //LogLevel.Information
                })
                .UseNLog();  // NLog: Setup NLog for Dependency injection;

感谢帮助!

我 运行 在工作中使用 Hangfire 遇到过类似的问题。虽然您可以随意处理空闲超时和应用程序初始化程序(https://docs.hangfire.io/en/latest/deployment-to-production/making-aspnet-app-always-running.html 仅作为示例),但我们最终将所有内容都移到了 .NET Core Worker Service 中并将其托管为 Windows 服务。

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1&tabs=visual-studio

这就是我建议的方法,效果很好。