使用.net标准

时间:2018-03-22 05:30:25

标签: c# azureservicebus .net-standard

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

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

...

问题:我以前习惯使用较旧的WindowsAzure库。现在我使用.NET标准,它不支持旧库

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

...

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

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

...

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

解决方案:https://github.com/Azure-Samples/service-bus-dotnet-management提供了一般的编程模式。

...

问题:WTF是它正在谈论的{tenantId}?

解决方案:很清楚,它是在" Azure Active Directory" - > "属性"并有助于标记"目录ID"而不是tenantId,正如人们所期望的那样

...

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

解决方案:更容易。从这些信息中可以明显看出,你必须:

  1. 转到" Azure Active Directory"
  2. 点击"应用注册"
  3. 点击"创建新的应用注册"
  4. 将其命名为“#app; Web app / API"并在网址上给出一个你想要的任何东西的标志,因为它实际上并不重要,即使它是强制性的
  5. 记录"应用程序ID",大家都知道它实际上是{clientId}所指的
  6. 在新申请中,点击"设置"
  7. 点击"按键"
  8. 在"密码"下输入一些随机说明。部分并点击"保存"
  9. 保存"价值"在那里,因为它秘密地{clientSecret}(多么聪明!它的秘密!)
  10. 返回"服务总线"
  11. 选择"访问控制(IAM)"
  12. 选择像所有者/贡献者
  13. 这样的角色
  14. 输入您的应用程序名称并保存
  15. ...

    好的,示例工作的第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} ??

    这样的方案

    ...

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

    那就是我被困的地方。我哪里出错?

    在旁注中,snark反映了我的挫败感 - 我觉得好像需要学习一大堆Azure技术,我不想知道任何事情只是为了做某事"应该简单"。就像我被一个兔子洞吸了一样。

    [编辑#1] - " SubscriptionId"原来是在门户网站的结算部分找到的AZURE订阅ID,而不是指服务总线订阅。

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

    随着这些变化,经过无数个小时的研究,IT工作

2 个答案:

答案 0 :(得分:17)

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

Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ apps/acheron/src/selectors/util/generic.js:74:4

Cannot call createSelector with array literal bound to selectors because:
 • Base [1] is incompatible with T [2] in array element of the indexer property of the return value of index 0.
 • T [1] is incompatible with Base [2] in array element of the indexer property of the return value of index 0.

 [1] 70│   (arr: A): {[string]: $ReadOnlyArray<T>} => groupBy(arr, (o: T): mixed => o.foo),
     71│ );
     72│
     73│ export const selector2 = <T: Base, A: $ReadOnlyArray<T>>(specificSelector: SpecificSelector<A>) => createSelector(
     74│   [selector1(specificSelector),
     75│   (state: State, props: mixed): ?string => props && props.match && props.match.params && typeof props.match.params.appId === 'string' ? props.match.params.appId : null],
     76│
 [2] 77│   (arr: {[string]: $ReadOnlyArray<T>}, appId: ?string): ?$ReadOnlyArray<T> =>
     78│     arr && appId && arr[appId]

答案 1 :(得分:3)

新Azure Service Bus客户端的原始计划根本不包括管理平面,而是使用Azure Active Directory路由。事实证明,这有点问题,就像你已经指出的那样。 Microsoft消息传递团队已经组建了一个sample来演示基本操作。

请注意,pending PR可以使用.NET Core 2.0

展望未来,人们认识到开发人员更喜欢使用类似于Azure Active Directory选项的连接字符串来访问Service Bass。引发Management Operations issue以跟踪请求。 Current plan是为.NET Standard客户端提供轻量级管理库。

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