在我的MVC .NET core 2.2应用程序中,有HostedService负责后台工作。
在Startap类的ConfigureServices方法中注册
services.AddHostedService<Engines.KontolerTimer>();
由于这是独立于用户请求的后台服务,因此我想在应用启动时立即启动我的后台服务。现在是我的HostedService在第一个用户请求后开始凝视的情况。
启动MVC Core应用程序时启动HostedService的正确方法是什么
我的秘密看起来像这样一个https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.2
internal class TimedHostedService : IHostedService, IDisposable
{
private readonly ILogger _logger;
private Timer _timer;
public TimedHostedService(ILogger<TimedHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Background Service is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation("Timed Background Service is working.");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Background Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
看起来我根本无法启动应用程序。
我的porgram CS看起来像
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
.UseStartup<Startup>();
}
在第一个用户请求之前,我没有遇到任何中断点。我错过了什么吗,这是VS2017创建的默认.Net Core应用程序
这是我的starup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
private Models.Configuration.SerialPortConfiguration serialPortConfiguration;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, ApplicationRole>(options => options.Stores.MaxLengthForKeys = 128)
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddDbContext<Data.Parking.parkingContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddHostedService<Engines.KontolerTimer>();}
使用Visual Studio运行此程序时,可能会使用IIS Express,直到发出第一个请求时,IIS Express才会运行ASP.NET Core项目(这实际上就是IIS默认情况下的工作方式)。这在使用ASP.NET Core 2.2新增的InProcess托管模型时适用,我希望您必须使用它才能看到此问题。有关更多信息,请参见此GitHub问题。
您可以通过从用于承载ASP.NET Core应用程序的.csproj文件中删除AspNetCoreHostingModel XML元素来证明这一理论,该文件将切换回OutOfProcess模式。在VS2017的项目属性对话框的“调试”下,似乎有一个“托管模型”选项,如果您不想直接编辑.csproj,则可以将其更改为“进程外”。
例如,如果只希望对生产站点进行宿主模型的进程外处理,则可以使用Web.config转换。如果您希望它在开发和生产过程中都处于进程外,只需更改我在上面调用的属性就足够了,因为它会自动转换为Web.config属性。如果您希望使用进程内模型,则在IIS应用程序中启用预加载是一个不错的选择(在此进行介绍)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句