.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.ServiceBusSDK版本支持.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
相关产品推荐
相关产品推荐

