Dapr集成Azure Service Bus无法接收消息问题求助
问题描述
我基于ASP.NET Core Web API搭建了OrderService应用,需要接收Azure Service Bus Topic上的消息。目前已经通过POST SendMessages接口成功将JSON消息发送到该Topic,但无法接收到Topic的消息通知,请问哪里配置出错了?
Servicebus.yaml 配置
apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: servicebus-pubsub namespace: default spec: type: pubsub.azure.servicebus version: v1 metadata: - name: connectionString value: "Endpoint=sb://<<sbName>>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<<key>>" - name: topic value: "order-service-event" - name: subscriptionName value: "test"
Program.cs 代码
... var app = builder.Build(); // Dapr will send serialized event object vs. being raw CloudEvent app.UseCloudEvents(); // needed for Dapr pub/sub routing app.MapSubscribeHandler(); ... // Dapr subscription in [Topic] routes orders topic to this route app.MapPost("/orders", [Topic("servicebus-pubsub", "order-service-event")] (dynamic order) => { Console.WriteLine("Subscriber received order: " + order); return Results.Ok(order); }); app.Run(); public record Order([property: JsonPropertyName("id")] int id);
OrderController.cs 代码
namespace OrderService.Controllers { [ApiController] [Route("[controller]")] public class OrderController : ControllerBase { [HttpPost(Name = "send-messages-provisioned")] public async Task<IActionResult> SendMessages() { var _client = new DaprClientBuilder().Build(); var messages = JsonSerializer.Deserialize<List<Dictionary<string, object>>>(System.IO.File.ReadAllText("messages.json")); foreach (var message in messages) { await _client.PublishEventAsync("servicebus-pubsub", "order-service-event", message); string jsonString = JsonSerializer.Serialize(message, new JsonSerializerOptions { WriteIndented = true }); Console.WriteLine("Published Message: " + jsonString); } return Ok("Messages sent successfully!"); } } }
问题排查与修复方案
1. PubSub组件配置错误
Azure Service Bus的Dapr PubSub组件不需要在组件级别指定topic,该配置会强制组件绑定到固定Topic,和代码中通过[Topic]属性声明的订阅冲突。删除spec.metadata中的topic配置项即可:
apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: servicebus-pubsub namespace: default spec: type: pubsub.azure.servicebus version: v1 metadata: - name: connectionString value: "Endpoint=sb://<<sbName>>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<<key>>" - name: subscriptionName value: "test"
2. 消息接收序列化问题
使用dynamic类型接收消息容易出现序列化匹配问题,换成强类型的Order对象确保消息结构正确解析:
app.MapPost("/orders", [Topic("servicebus-pubsub", "order-service-event")] (Order order) => { Console.WriteLine($"Subscriber received order: {order.id}"); return Results.Ok(order); });
3. 权限与运行状态检查
- 确认Azure Service Bus连接字符串对应的Shared Access Policy拥有Listen权限(RootManageSharedAccessKey默认包含该权限,自定义Policy需手动配置)。
- 检查Dapr Sidecar是否正常运行:执行
dapr list查看应用关联的Sidecar状态,或通过dapr logs --app-id <你的应用ID>查看订阅注册、消息投递的日志信息,排查是否有连接或路由错误。
内容的提问来源于stack exchange,提问作者AzureDev
相关产品推荐
相关产品推荐

