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

.NET Framework 4.6.1应用接收Azure Service Bus消息求助

.NET Framework 4.6.1 Web应用(Global.asax)接收Azure Service Bus队列消息示例

针对你的场景,Web应用(以Global.asax为入口)和控制台应用的核心差异在于应用生命周期管理,需要在应用启动时初始化Service Bus消息处理器,并在应用停止时释放资源,避免处理器被GC回收。以下是适配的代码示例:

Global.asax.cs 完整代码

using System;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;

public class Global : System.Web.HttpApplication
{
    // 全局持有ServiceBus处理器,避免被GC回收
    private static ServiceBusProcessor _serviceBusProcessor;

    protected void Application_Start(object sender, EventArgs e)
    {
        // 替换为你的Service Bus连接字符串和队列名称
        string connectionString = "你的Service Bus连接字符串";
        string queueName = "你的队列名称";

        // 创建ServiceBusClient实例
        var client = new ServiceBusClient(connectionString);

        // 创建队列处理器,可根据需求配置选项
        _serviceBusProcessor = client.CreateProcessor(queueName, new ServiceBusProcessorOptions
        {
            // 并发处理的消息数,可根据服务器性能调整
            MaxConcurrentCalls = 5,
            // 是否自动完成消息,建议设为false,手动控制完成/放弃
            AutoCompleteMessages = false
        });

        // 注册消息处理回调
        _serviceBusProcessor.ProcessMessageAsync += ProcessReceivedMessageAsync;
        // 注册错误处理回调
        _serviceBusProcessor.ProcessErrorAsync += ProcessErrorAsync;

        // 启动处理器,同步等待启动完成(Application_Start为同步方法)
        _serviceBusProcessor.StartProcessingAsync().GetAwaiter().GetResult();
    }

    protected void Application_End(object sender, EventArgs e)
    {
        // 应用停止时关闭处理器,释放资源
        _serviceBusProcessor?.StopProcessingAsync().GetAwaiter().GetResult();
        _serviceBusProcessor?.DisposeAsync().AsTask().GetAwaiter().GetResult();
    }

    /// <summary>
    /// 消息处理逻辑
    /// </summary>
    private async Task ProcessReceivedMessageAsync(ProcessMessageEventArgs args)
    {
        try
        {
            // 获取消息内容
            string messageBody = args.Message.Body.ToString();
            // 在这里添加你的业务逻辑,比如解析消息、存储到数据库等
            Console.WriteLine($"收到消息: {messageBody}");

            // 手动完成消息,告知Service Bus消息已处理完成
            await args.CompleteMessageAsync(args.Message);
        }
        catch (Exception ex)
        {
            // 处理异常,可根据情况选择放弃消息或重新入队
            Console.WriteLine($"处理消息出错: {ex.Message}");
            // 放弃消息,消息会重新回到队列(可配置重试次数)
            await args.AbandonMessageAsync(args.Message);
        }
    }

    /// <summary>
    /// 错误处理逻辑
    /// </summary>
    private Task ProcessErrorAsync(ProcessErrorEventArgs args)
    {
        // 记录错误日志,比如写入本地日志或日志系统
        Console.WriteLine($"Service Bus错误: {args.Exception.Message}, 错误来源: {args.ErrorSource}");
        return Task.CompletedTask;
    }
}

关键注意事项

  • SDK版本兼容:确保安装的Azure.Messaging.ServiceBus SDK版本支持.NET Framework 4.6.1,推荐使用7.x系列版本(8.x系列最低要求.NET Framework 4.7.2)。
  • 全局实例持有:必须将ServiceBusProcessor声明为静态成员,否则Application_Start执行完成后,处理器会被垃圾回收,导致无法持续接收消息。
  • 同步等待异步操作:在Application_Start和Application_End中使用.GetAwaiter().GetResult()等待异步操作完成,因为这两个方法是同步执行的。
  • 消息处理控制:建议关闭AutoCompleteMessages,手动调用CompleteMessageAsync或AbandonMessageAsync,避免因业务逻辑异常导致消息丢失。

内容的提问来源于stack exchange,提问作者Karan Rao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:10:32