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

问题描述 投票:14回答:2

我的情况:网站托管在云上,每个实例在其中创建对服务总线主题的订阅,以便其自己侦听消息。

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

...

问题:我习惯使用较旧的WindowsAzure库。现在,我正在使用不支持旧库的.NET Standard。

解决方案:使用Microsoft.Azure.ServiceBus NuGet包

...

问题:它不支持管理功能(例如创建订阅)

解决方案:还使用NuGet库Microsoft.Azure.Management.ServiceBus

...

问题:它不支持使用连接字符串或Azure门户提供给您的密钥

解决方案:https://github.com/Azure-Samples/service-bus-dotnet-management给出要使用的常规编程模式。

...

问题:WTF是它在说的{tenantId}?

解决方案:显然,它位于“ Azure Active Directory”->“ Properties”下,并像人们期望的那样有用地标记为“ Directory ID”,而不是tenantId。

...

问题:WTF是{clientId}和{clientSecret}?

解决方案:更加容易。根据这些信息,您必须:

  1. 转到“ Azure Active Directory”
  2. 点击“应用程序注册”
  3. 单击“创建新的应用程序注册”
  4. 命名,将其保留为“ Web app / API”,并在URL上添加几乎任何您想要的符号,因为即使强制性,它实际上也没有关系
  5. 记录每个人都知道实际上是{clientId}所指的“应用程序ID”
  6. 在新应用程序中,单击“设置”
  7. 单击“键”
  8. 在“密码”部分下键入一些随机描述,然后单击“保存”
  9. 将“值”保存在那里,因为它是{clientSecret}的秘密内容(多么聪明!因为它是秘密的!!)
  10. 返回“服务总线”
  11. 选择“访问控制(IAM)”
  12. 选择类似所有者/贡献者的角色
  13. 输入您的应用程序名称并保存

...

确定,示例的步骤1起作用了吗? AcquireTokenAsync返回访问令牌! YAYYYYYYYYYYYYY]]

result.AccessToken是步骤2中提到的“令牌”。

第2步,第3步...没问题...继续执行第4步。除了使用sbClient.Subscriptions.CreateOrUpdate之外

{{resourceGroupName}似乎很容易-从门户上的“资源组”复制]]

...

问题:{namespaceName}是什么?

这是服务总线名称吗?例如{name} .servicebus.windows.net?还是名称空间像{name.servicebus.windows.net}这样完整?还是包含{sb://name.servicebus.windows.net}这样的方案?

...

问题:无论我在这里尝试什么,最终在CreateOrUpdate调用时都会出现“操作返回了无效状态代码'NotFound'的操作。”

这就是我被困住的地方。我在哪里弄错了?

并且在旁注中,snark反映了我的挫败感-确实感觉好像我需要学习大量的Azure技术,我真的不想要了解任何事情,只是为了做“应该做的事”。简单”。就像我被兔子洞吸了一样。

[[EDIT#1]-“ S​​ubscriptionId”原来是在门户网站的计费部分下找到的AZURE订阅ID,不涉及服务总线订阅。

[[EDIT#2]-“ namespaceName”不包括.servicebus.windows.net-只是名称本身

随着这些变化,经过无数小时的研究,它确实起作用了>>

我的情况:网站托管在云上,每个实例在其中创建对服务总线主题的订阅,以便其自己侦听消息。我的问题:如何以编程方式创建...

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

新Azure Service Bus客户端的原始计划根本不包括管理平面,而是使用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版本的一部分发布。

c# azureservicebus .net-standard
2个回答
26
投票

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

3
投票

新Azure Service Bus客户端的原始计划根本不包括管理平面,而是使用Azure Active Directory路由。正如您已经指出的那样,这已被证明太麻烦了。 Microsoft邮件团队已将sample组合在一起以演示基本操作。

注意,有一个pending PR使其可与.NET Core 2.0一起使用

向前迈进,人们认识到开发人员喜欢使用连接字符串来访问Service Bass,就像他们过去使用Azure Active Directory选项一样。引发Management Operations issue以跟踪请求。 Current plan为.NET Standard客户端提供轻量级管理库。

© www.soinside.com 2019 - 2024. All rights reserved.