You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在继承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.WebJobs
  • Microsoft.Azure.WebJobs.Extensions
  • Microsoft.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:11:00