web-dev-qa-db-ja.com

.net標準を使用してプログラムでService Busサブスクリプションを作成する

私のシナリオ:各インスタンスがメッセージをリッスンするために各インスタンスがService Busトピックへのサブスクリプションを作成する、クラウドでホストされているWebサイト。

私の質問:プログラムでサブスクリプションを作成するにはどうすればよいですか?

...

問題:古い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"にあり、期待どおり、tenantIdの代わりに "Directory ID"というラベルが付いています。

...

問題:WTFは{clientId}および{clientSecret}ですか?

解決策:さらに簡単です。あなたがしなければならないことはその情報から明らかです:

  1. 「Azure Active Directory」に移動します
  2. 「アプリ登録」をクリック
  3. 「新規アプリ登録を作成」をクリック
  4. 名前を付け、「Webアプリ/ API」のままにして、必要なほとんどすべてのサインオンURLを付けます。これは必須ですが、実際には問題にならないためです。
  5. 誰もが知っている「アプリケーションID」を記録する{clientId}が実際に参照しているもの
  6. 新しいアプリケーションで「設定」をクリックします
  7. 「キー」をクリックします
  8. 「パスワード」セクションの下にランダムな説明を入力し、「保存」をクリックします
  9. それはひそかに{clientSecret}であるため、そこに「値」を保存します(なんて賢い!それは秘密です!!)。
  10. 「サービスバス」に戻る
  11. 「アクセス制御(IAM)」を選択します
  12. オーナー/寄稿者などの役割を選択してください
  13. アプリケーション名を入力して保存します

...

では、例のステップ1は機能しますか? AcquireTokenAsyncがアクセストークンを返します! YAYYYYYYYYYYYYYY

result.AccessTokenは、ステップ2で参照される「トークン」です。

ステップ2、3 ...問題ありません...ステップ4に進みます。代わりにsbClient.Subscriptions.CreateOrUpdateを使用します

{resourceGroupName}はとても簡単に思えます-ポータルの「リソースグループ」からコピーしてください

...

問題:{namespaceName}とは何ですか?

Service Busの名前ですか? {name} .servicebus.windows.net?または、名前空間は{name.servicebus.windows.net}のような完全なものですか?それとも{sb://name.servicebus.windows.net}のようなスキームが含まれていますか?

...

問題:ここで何を試しても、CreateOrUpdate呼び出しで「操作が無効なステータスコード 'NotFound'を返しました」と表示されます。

そして、それが私が行き詰まっているところです。どこが間違っているのですか?

補足として、スナークは私の欲求不満を反映しています-「単純なはずのことをするためだけに何も知りたくないAzureテクノロジの大規模なスタックを学ぶ必要があるように本当に感じます」私がうさぎの穴に吸い込まれているように。

[編集#1]-「SubscriptionId」は、サービスバスのサブスクリプションではなく、ポータルの請求セクションにあるAzureサブスクリプションIDであることがわかります。

[編集#2]-「namespaceName」には.servicebus.windows.netは含まれません-名前自体のみ

そして、これらの変化により、数え切れないほどの時間の研究の後、IT WORKS

17
Josh

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

新しいAzure Service Busクライアントの当初の計画は、管理プレーンをまったく含まず、代わりにAzure Active Directoryルートを使用することでした。あなたが指摘したように、これは問題が多すぎることが証明されています。 Microsoftメッセージングチームは、基本的な操作を示すために sample をまとめました。

.NET Core 2.0で動作させるために 保留中のPR があることに注意してください

今後、開発者は、Azure Active Directoryオプションを使用するのと同じように、接続文字列を使用してService Bassにアクセスすることを好みます。 管理操作の問題 要求を追跡するために発生します。 最新計画 は、.NET Standardクライアントに軽量の管理ライブラリを提供することです。

現時点では、古いクライアントを利用してエンティティを作成するか、管理パッケージが利用可能になるまでMicrosoft.Azure.Management.ServiceBus(またはFluent)を使用するかのいずれかを選択できます。

更新

管理操作は、クライアントの3.1.0バージョンの一部としてリリースされました。

5
Sean Feldman