使用 .net 标准以编程方式创建服务总线订阅

Programmatically create service bus subscription using .net standard

我的场景:托管在云上的网站,其中每个实例都为自己创建一个服务总线主题订阅以侦听消息。

我的问题:如何以编程方式创建订阅?

新的 Azure 服务总线客户端的原始计划根本不包括管理平面,而是使用 Azure Active Directory 路由。正如您所指出的,这已被证明是有问题的。 Microsoft 消息传递团队整理了一个 sample 来演示基本操作。

请注意,有一个 pending PR 可以让它与 .NET Core 2.0 一起工作

展望未来,人们认识到开发人员更喜欢使用连接字符串访问 Service Bass,就像他们过去使用 Azure Active Directory 选项一样。 Management Operations issue is raised to track requests. Current plan 是为.NET Standard 客户端提供一个轻量级的管理库。

目前,选项是利用旧客户端创建实体或使用 Microsoft.Azure.Management.ServiceBus(或 Fluent)直到管理包可用。

更新

管理操作已作为 3.1.0 版客户端的一部分发布。

Microsoft.Azure.ServiceBus.3.1.0 允许使用 ConnectionString 创建一个 ManagementClient。

private async Task CreateTopicSubscriptions()
{
    var client = new ManagementClient(ServiceBusConnectionString);
    for (int i = 0; i < Subscriptions.Length; i++)
    {
        if (!await client.SubscriptionExistsAsync(TopicName, Subscriptions[i]))
        {
            await client.CreateSubscriptionAsync(new SubscriptionDescription(TopicName, Subscriptions[i]));
        }
    }
}

Microsoft.Azure.ServiceBus 已弃用。新选项是 Azure.Messaging.ServiceBus and ManagementClient has been replaced by ServiceBusAdministrationClient.

string connectionString = "<connection_string>";
ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString);

这个新包还支持 ManagedIdentity:

string fullyQualifiedNamespace = "yournamespace.servicebus.windows.net";
ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(fullyQualifiedNamespace, new DefaultAzureCredential());

一个小例子:

var queueExists = await _administrationClient.QueueExistsAsync(queueName);
        if(!queueExists)
            await _administrationClient.CreateQueueAsync(queueName);

更多信息here