如何使用 Microsoft.Azure.ServiceBus 在订阅上创建 MessageReceiver

How to create MessageReceiver on subscription using Microsoft.Azure.ServiceBus

我正在尝试用 .NET Standard Microsoft.Azure.ServiceBus 替换 .NET Framework NuGet 包 WindowsAzure.ServiceBus,但我遇到了问题。如何为服务总线主题订阅创建 MessageReceiver 实例?我可以使用以下代码为队列创建它:

var receiver = new MessageReceiver(connectionString, queueName);
var bytes = receiver.ReceiveAsync().Result.Body;
string s = Encoding.UTF8.GetString(bytes);
Console.WriteLine(s);

但是 MessageReceiver 没有用于从服务总线主题订阅获取数据的构造函数。

我在 Microsoft.Azure.ServiceBus 源代码中找到了答案。原来,在 EntityNameHelper class 中有生成消息传递实体路径的静态函数。例如,对于订阅,它看起来像

EntityNameHelper.FormatSubscriptionPath(topicName, subscriptionName)

因此,完整的 MessageReceiver 初始化代码如下所示:

string path = EntityNameHelper.FormatSubscriptionPath(topicName, subscriptionName);
var receiver = new MessageReceiver(connectionString, path);
var bytes = receiver.ReceiveAsync().Result.Body;
string s = Encoding.UTF8.GetString(bytes);
Console.WriteLine(s);

除了Yuriy的优秀回答,ServieBusConnectionStringBuilder也可以用来包含配置数据,我觉得这样更简洁一些。

var builder = new ServiceBusConnectionStringBuilder(connectionString)
    {
        TransportType = TransportType.AmqpWebSockets,
        EntityPath = EntityNameHelper.FormatSubscriptionPath(topic, subscription)
    };

var messageReceiver = new MessageReceiver(builder);