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

如何用C#读取Service Bus主题死信队列?路径异常求助

解决Service Bus主题订阅死信路径异常问题

我来帮你排查这个路径错误的问题,核心原因是主题订阅的路径格式不符合Service Bus的要求,另外你的MessageSender用法也有小问题,下面一步步修正:

问题根源

Service Bus中主题订阅的完整路径必须包含Subscriptions层级,格式为:{TopicName}/Subscriptions/{SubscriptionName}。你当前使用的"TopicName/SubscriptionName"缺少了这个关键层级,导致TopicClient.FormatDeadLetterPath生成的死信路径不符合服务端预期,从而抛出"路径不正确"的异常。

另外,MessageSender只能发送消息到主题或队列,不能直接发送到订阅路径——如果你的目标是把死信消息重新发回主题,应该使用主题名作为发送路径。

修正后的代码

// 1. 构造正确的订阅完整路径
string subscriptionPath = "TopicName/Subscriptions/SubscriptionName";
// 2. 提取主题名,用于创建MessageSender
string topicName = "TopicName";

MessagingFactory messageFactory = MessagingFactory.CreateFromConnectionString("ConnectionString");

// 3. 生成正确的死信路径并创建接收器
MessageReceiver deadletterReceiver = await messageFactory.CreateMessageReceiverAsync(
    TopicClient.FormatDeadLetterPath(subscriptionPath), 
    ReceiveMode.PeekLock);

// 4. 使用主题名创建MessageSender(发送到主题,而非订阅)
MessageSender sender = await messageFactory.CreateMessageSenderAsync(topicName);

BrokeredMessage deadLetter = await deadletterReceiver.ReceiveAsync(TimeSpan.Zero);
if (deadLetter != null) {
    // 处理死信消息的逻辑,比如重新发送
    await sender.SendAsync(deadLetter);
    await deadLetter.CompleteAsync();
}

额外说明

  • 如果你使用的是较新的Azure.Messaging.ServiceBus SDK(推荐),API会更直观,死信路径的构造可以通过ServiceBusReceiverOptions直接指定接收死信队列,不需要手动拼接路径。不过针对你当前使用的旧SDK(Microsoft.ServiceBus.Messaging),上面的修正完全适用。
  • 处理死信消息时,记得在完成操作后调用CompleteAsync()释放锁,避免消息一直保留在死信队列中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:01:28