【问题标题】:Programmatically create service bus subscription using .net standard使用 .net 标准以编程方式创建服务总线订阅
【发布时间】:2018-08-31 10:48:27
【问题描述】:

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

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

【问题讨论】:

  • 我听到了。从第一天起就一直在要求管理操作。好消息是团队正在倾听。也许要让它更现实,这需要时间。建议在我的答案中链接的 GitHub 问题中发表您的意见。
  • 乔希,您可以考虑将 Gustavo 的答案标记为已接受的答案,因为它将帮助其他解决此问题的人。

标签: c# azureservicebus .net-standard


【解决方案1】:

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]));
        }
    }
}

【讨论】:

  • @josh,我很高兴找到这个问题,而不是遇到这种挫败感。毫无疑问,他现在的体验要好得多,就像实际可用一样。
  • 这很难找到。 SO FTW!
  • SqlFilter 怎么样?代码里也可以加吗?
  • 关于如何为 EventHubs 完成等效操作的任何消息?
  • 由于 SubscriptionExistsAsync 和 CreateSubscriptionAsync 都在后台执行 REST 调用,因此存在竞争——如果在两个调用之间创建了订阅,则第二个调用将失败并出现异常。不过,不知道如何解决它,因为我找不到任何具有“如果不存在则创建”语义的东西。
【解决方案2】:

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

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

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

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

更新

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

【讨论】:

  • 接受这个答案是因为虽然它没有解决技术问题,但它现在解决了库状态的底层 WTF-itude。
  • @josh 你很搞笑 :) 完全同意挫折程度。请就这个问题发表意见。您会发现 ASB 团队倾听并采取行动。
  • @SeanFeldman,我认为 Gustavo 的答案现在应该成为例外答案。
  • @RajRao 我不确定你希望我做什么。这是 SO 的问题 - 答案是在问题的上下文中提供的。当问题被问到时,还没有ManagementClient。所以答案是正确的在那个时间点。我只能修改我的答案以表明该计划已经实施。
  • 另外,我链接到的问题已在 3.1.0 中关闭,也就是 ManagementClient 发布的时候。干杯。
【解决方案3】:

Microsoft.Azure.ServiceBus 已被弃用。新选项为Azure.Messaging.ServiceBus,ManagementClient 已替换为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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    相关资源
    最近更新 更多