在ASP.NET Core Program.cs中配置Quartz触发器遇CS1061错误
解决ASP.NET Core中IWebHostBuilder无Services定义的错误
错误原因
IWebHostBuilder接口本身并不包含Services属性,直接通过webBuilder.Services访问服务容器是错误的用法。正确的服务配置方式是通过ConfigureServices方法实现,或是在Host层级进行配置。
修复方案1:在Host层级配置Quartz服务
将Quartz服务配置逻辑移到ConfigureWebHostDefaults外部,直接在HostBuilder上调用ConfigureServices方法:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionScopedJobFactory(); var jobKey = new JobKey("TestTask"); q.AddJob<Orange38_Application.Scheduled_Tasks.TestTask>(opts => opts.WithIdentity(jobKey)); q.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity("TestTask-trigger") .WithCronSchedule("0 0/1 0 ? * * *") ); }); services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true); }) .ConfigureWebHostDefaults(webBuilder => { // webBuilder.UseStartup<Startup>(); });
修复方案2:在WebHostBuilder内使用ConfigureServices方法
如果需要在ConfigureWebHostDefaults内部配置服务,需调用webBuilder.ConfigureServices方法包裹服务注册逻辑:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { // webBuilder.UseStartup<Startup>(); webBuilder.ConfigureServices(services => { services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionScopedJobFactory(); var jobKey = new JobKey("TestTask"); q.AddJob<Orange38_Application.Scheduled_Tasks.TestTask>(opts => opts.WithIdentity(jobKey)); q.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity("TestTask-trigger") .WithCronSchedule("0 0/1 0 ? * * *") ); }); services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true); }); });
额外注意事项
- 确认已安装必要的NuGet包:
Quartz和Quartz.Extensions.Hosting - 若使用ASP.NET Core 6+的极简模式(无Startup.cs),推荐使用第一种Host层级配置方式,更贴合当前框架的设计规范
内容的提问来源于stack exchange,提问作者VDS
相关产品推荐
相关产品推荐

