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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:38:29