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

部署在Azure App Service的.NET Core REST API如何感知并消费消息队列消息

.NET Core Web App部署到Azure App Service后自动消费队列消息方案

核心思路:用后台托管服务实现持续监听

Azure App Service的Web App默认是请求驱动的,但要自动感知队列消息并消费,需要在应用启动时启动一个常驻后台任务。.NET Core的IHostedService(或BackgroundService抽象类)是标准实现方式,它会和Web API进程一起启动,在后台持续运行监听队列。

具体实现步骤(以Azure Service Bus为例)

1. 安装依赖包

安装Azure Service Bus的官方SDK:

Install-Package Azure.Messaging.ServiceBus

2. 编写后台消费服务

继承BackgroundService实现消息监听逻辑:

using Azure.Messaging.ServiceBus;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

public class ServiceBusConsumerService : BackgroundService
{
    private readonly ServiceBusClient _client;
    private readonly ServiceBusProcessor _processor;
    private readonly ILogger<ServiceBusConsumerService> _logger;

    // 通过配置注入服务总线连接信息
    public ServiceBusConsumerService(IConfiguration config, ILogger<ServiceBusConsumerService> logger)
    {
        var connectionString = config["ServiceBus:ConnectionString"];
        var queueName = config["ServiceBus:QueueName"];
        
        _client = new ServiceBusClient(connectionString);
        _processor = _client.CreateProcessor(queueName, new ServiceBusProcessorOptions());
        _logger = logger;

        // 绑定消息处理和错误处理事件
        _processor.ProcessMessageAsync += ProcessMessageAsync;
        _processor.ProcessErrorAsync += ProcessErrorAsync;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // 启动监听
        await _processor.StartProcessingAsync(stoppingToken);
        _logger.LogInformation("Service Bus消费者已启动");

        // 等待应用停止信号
        await Task.Delay(Timeout.Infinite, stoppingToken);
    }

    private async Task ProcessMessageAsync(ProcessMessageEventArgs args)
    {
        var messageContent = args.Message.Body.ToString();
        _logger.LogInformation($"收到消息:{messageContent}");

        // 在这里编写你的业务处理逻辑,比如调用内部服务处理消息
        // ...

        // 标记消息处理完成,从队列移除
        await args.CompleteMessageAsync(args.Message);
    }

    private Task ProcessErrorAsync(ProcessErrorEventArgs args)
    {
        _logger.LogError(args.Exception, $"消息处理出错:{args.ErrorSource}");
        return Task.CompletedTask;
    }

    public override async Task StopAsync(CancellationToken stoppingToken)
    {
        // 停止监听并释放资源
        await _processor.StopProcessingAsync(stoppingToken);
        await _processor.DisposeAsync();
        await _client.DisposeAsync();
        await base.StopAsync(stoppingToken);
    }
}

3. 注册后台服务

在Program.cs里将服务注入DI容器:

builder.Services.AddHostedService<ServiceBusConsumerService>();

Azure App Service关键配置

1. 关闭闲置休眠

Azure App Service默认20分钟无请求会休眠应用,导致后台服务停止。需要:

  • 进入Azure Portal → 你的Web App → 配置 → 常规设置
  • 将始终开启设为开启
  • 保存配置,确保应用持续运行

2. 配置敏感信息

在App Service的配置 → 应用程序设置中添加:

  • ServiceBus__ConnectionString:Azure Service Bus连接字符串
  • ServiceBus__QueueName:目标队列名称
    避免硬编码敏感信息,符合微服务配置规范。

其他队列系统适配思路

不管用RabbitMQ还是Kafka,核心逻辑一致:

  • RabbitMQ:使用RabbitMQ.Client包,在后台服务中创建消费者通道持续监听
  • Kafka:使用Confluent.Kafka包,创建Consumer实例持续拉取消息
    都是通过BackgroundService托管后台任务,和Web API进程绑定运行。

微服务视角的优势

  • 消费逻辑与API业务逻辑在同一服务实例,无需额外部署Azure Function,降低服务拆分复杂度
  • 可利用App Service的自动扩缩容能力,消息积压时通过横向扩容提升消费能力
  • 日志、监控、部署流程与API服务统一,简化运维成本

内容的提问来源于stack exchange,提问作者Bipin Lende

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:42:41