在继承BackgroundService的.NET Core Windows服务中使用WebJobs SDK v3.x并调用Host.Run
在继承BackgroundService的.NET Core Windows服务中使用WebJobs SDK v3.x并调用Host.Run
核心思路
WebJobs SDK v3.x基于.NET Generic Host构建,可直接在Windows服务的Host配置中整合WebJobs逻辑,通过自定义BackgroundService管理WebJobs生命周期,最终通过Host.Run维持服务运行。
步骤1:安装必要NuGet包
根据需求安装以下包:
Microsoft.Azure.WebJobsMicrosoft.Azure.WebJobs.ExtensionsMicrosoft.Extensions.Hosting.WindowsServices- 对应触发器扩展(如
Microsoft.Azure.WebJobs.Extensions.Storage、Microsoft.Azure.WebJobs.Extensions.ServiceBus)
步骤2:配置HostBuilder
在Program.cs中构建Host,同时配置Windows服务和WebJobs:
var host = Host.CreateDefaultBuilder(args) .UseWindowsService() // 标记为Windows服务 .ConfigureWebJobs(builder => { // 添加WebJobs核心服务与所需扩展 builder.AddAzureStorageCoreServices(); builder.AddServiceBus(); // 示例:添加ServiceBus触发器支持 // 其他WebJobs配置(如日志、过滤器等) }) .ConfigureServices(services => { // 注册自定义BackgroundService services.AddHostedService<WebJobsBackgroundService>(); }) .Build(); await host.RunAsync(); // 调用Host.Run维持服务生命周期
步骤3:实现自定义BackgroundService
通过该类管理WebJobs的启动与停止:
public class WebJobsBackgroundService : BackgroundService { private readonly IJobHost _jobHost; private readonly IHostApplicationLifetime _appLifetime; public WebJobsBackgroundService(IJobHost jobHost, IHostApplicationLifetime appLifetime) { _jobHost = jobHost; _appLifetime = appLifetime; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { try { // 启动WebJobs JobHost await _jobHost.StartAsync(stoppingToken); // 等待服务停止信号 await Task.Delay(Timeout.Infinite, stoppingToken); } finally { // 停止JobHost await _jobHost.StopAsync(CancellationToken.None); // 通知Host终止应用 _appLifetime.StopApplication(); } } }
步骤4:编写WebJobs触发函数
创建包含触发器的函数类,示例队列触发:
public class WebJobsFunctions { public void ProcessQueueMessage([QueueTrigger("sample-queue")] string message, ILogger logger) { logger.LogInformation($"Processing queue message: {message}"); } }
注意事项
- 确保
appsettings.json中配置正确的连接字符串(如AzureWebJobsStorage、AzureWebJobsServiceBus) - 部署为Windows服务时,使用
dotnet publish生成可执行文件,再通过sc create命令安装 - 避免在函数或BackgroundService中使用阻塞同步操作,优先采用异步逻辑保证服务稳定性
内容的提问来源于stack exchange,提问作者OzBob
相关产品推荐
相关产品推荐

