C# 实现长时间运行的服务(无限长/始终可用)以处理ASP.NET核心Web Api中的数据
我会尽量简化这件事 作为ASP.NET Core Web Api(.NET Core 2.2)的一部分,我正在努力实现一个出租车调度器后台服务,该服务可以无限期运行并处理比赛->为比赛分配司机->在该区域连续获取新司机,并相应地从最近到最远分配给比赛(该服务读取和写入不同的Sql数据库表). 我将后台服务创建为一个托管服务,每当有比赛可用时,它就会执行上述所有操作,并在一个新的后台线程中处理每一场比赛。该api在IIS上的ftp服务器上运行 问题:它在开始时工作正常,但有时服务会超时,无法处理任何传入的比赛,我必须停止api并重新启动它,yikes,这不是我想要的行为,因为我希望我的xamarin forms应用程序能够响应并实时接收比赛 在我编写服务之后,我开始质疑我的实现,我遇到了诸如后台工作者、微服务和工作者服务之类的术语。。现在我更困惑于该解决什么或如何解决问题,以及是否有更好的方法解决这个问题 我在Web Api中使用干净的体系结构设计模式。以下是我在Program.cs文件中注册后台服务的方式:C# 实现长时间运行的服务(无限长/始终可用)以处理ASP.NET核心Web Api中的数据,c#,.net-core,asp.net-core-webapi,backgroundworker,background-service,C#,.net Core,Asp.net Core Webapi,Backgroundworker,Background Service,我会尽量简化这件事 作为ASP.NET Core Web Api(.NET Core 2.2)的一部分,我正在努力实现一个出租车调度器后台服务,该服务可以无限期运行并处理比赛->为比赛分配司机->在该区域连续获取新司机,并相应地从最近到最远分配给比赛(该服务读取和写入不同的Sql数据库表). 我将后台服务创建为一个托管服务,每当有比赛可用时,它就会执行上述所有操作,并在一个新的后台线程中处理每一场比赛。该api在IIS上的ftp服务器上运行 问题:它在开始时工作正常,但有时服务会超时,无法处理任
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;
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.ConfigureServices(服务=>
{
//将hostedservice用作API的一些变通方法
//看https://github.com/dotnet/extensions/issues/553
services.AddSingleton();
services.AddSingleton(p=>p.GetService());
})
.ConfigureLogging(日志=>
{
logging.ClearProviders();
logging.SetMinimumLevel(Microsoft.Extensions.logging.LogLevel.Trace);//LogLevel.Information
})
.UseNLog();//NLog:为依赖项注入设置NLog;
谢谢你的帮助 我在使用Hangfire的工作中遇到了类似的问题。虽然你可以随意处理空闲超时和应用程序初始化(仅作为一个例子),但我们最终将所有内容都转移到了.NET核心工作者服务中,并将其作为Windows服务托管
这就是我建议的方法,效果很好。你意识到你没有问过任何问题吗?@Gusman我问我是否有更好的实现我想要实现的目标的方法(第3段),我认为我是这种高级senario的不速之客:)IIS将控制你的应用程序的生命周期;如果应用程序空闲,它将启动进程并终止应用程序池。只有传入的请求才会导致IIS启动应用程序。有几种方法可以在IIS中控制这一点,但我在保持应用程序始终在IIS上运行方面并没有取得真正的成功。@有一种方法,但它真的很糟糕:创建一个静态计时器,每5-10分钟查询一次您自己的应用程序,这将阻止卸载应用程序。是的,“推荐”(如:工作)解决这个问题的方法是将你的应用程序作为Windows服务托管,而不是通过IIS托管。感谢@julian的友好回答和指出你的建议。上周我已经开始阅读有关工人服务的文章,我应该正在实现我想做的事情的路上。我将标记这一问题的答案,只要我可以得到演示与行为启动和运行。