web-dev-qa-db-fra.com

Créer par programme un abonnement au bus de service à l'aide de la norme .net

Mon scénario: site Web hébergé sur le cloud, où chaque instance crée un abonnement à une rubrique Service Bus pour écouter les messages.

Ma question: Comment créer des abonnements par programmation?

...

Problème: j'ai l'habitude d'utiliser l'ancienne bibliothèque WindowsAzure. J'utilise maintenant .NET Standard qui ne prend pas en charge l'ancienne bibliothèque

Solution: utilisez le package NuGet Microsoft.Azure.ServiceBus

...

Problème: il ne prend pas en charge les fonctionnalités de gestion (comme la création d'un abonnement)

Solution: utilisez également la bibliothèque NuGet Microsoft.Azure.Management.ServiceBus

...

Problème: il ne prend pas en charge l'utilisation d'une chaîne de connexion ou des clés qui vous sont fournies par le portail Azure

Solution: https://github.com/Azure-Samples/service-bus-dotnet-management donne le modèle de programmation général à utiliser.

...

Problème: WTF est le {tenantId} dont il parle?

Solution: bien clairement, il se trouve sous "Azure Active Directory" -> "Propriétés" et utilement étiqueté "ID de répertoire" au lieu de tenantId, comme on pourrait s'y attendre

...

Problème: WTF est le {clientId} et {clientSecret}?

Solution: encore plus facile. Il est évident d'après ces informations que vous devez:

  1. Accédez à "Azure Active Directory"
  2. Cliquez sur "Inscriptions d'application"
  3. Cliquez sur "Créer une nouvelle inscription d'application"
  4. Nommez-le, laissez-le comme "Application Web/API" et donnez-lui une URL de connexion à peu près tout ce que vous voulez, car cela n'a pas d'importance, même si c'est obligatoire
  5. Enregistrez l '"ID d'application", que tout le monde sait en fait à quoi {clientId} fait référence
  6. Dans votre nouvelle application, cliquez sur "Paramètres"
  7. Cliquez sur "Clés"
  8. Tapez une description aléatoire dans la section "Mots de passe" et cliquez sur "Enregistrer"
  9. Enregistrez la "valeur" là-bas, car c'est secrètement le {clientSecret} (comme c'est intelligent! Car c'est secret !!)
  10. Retour à "Service Bus"
  11. Sélectionnez "Contrôle d'accès (IAM)"
  12. Choisissez un rôle comme propriétaire/contributeur
  13. Tapez le nom de votre application et enregistrez

...

Ok, donc l'étape 1 de l'exemple fonctionne-t-elle? AcquireTokenAsync renvoie un jeton d'accès! YAYYYYYYYYYYYYYY

result.AccessToken est le "jeton" mentionné à l'étape 2, semble-t-il.

Étape 2, 3 ... aucun problème ... à l'étape 4. Sauf utiliser à la place sbClient.Subscriptions.CreateOrUpdate

{resourceGroupName} semble assez facile - copier à partir de "Resource groups" sur le portail

...

Problème: qu'est-ce que {namespaceName} ??

Est-ce le nom du Service Bus? comme {nom} .servicebus.windows.net? Ou est-ce que l'espace de noms est complet comme {name.servicebus.windows.net}? Ou inclut-il le schéma comme {sb: //name.servicebus.windows.net} ??

...

Problème: peu importe ce que j'essaie ici, je me retrouve avec "L'opération a renvoyé un code d'état non valide 'NotFound'" à l'appel de CreateOrUpdate.

Et c'est là que je suis coincé. Où je me suis trompé?

Et sur un sidenote, le snark reflète ma frustration - j'ai vraiment l'impression que j'ai besoin d'apprendre une grande pile de technologie Azure dont je ne veux vraiment rien savoir juste pour faire quelque chose qui "devrait être simple ". Comme si j'étais aspiré dans un terrier de lapin.

[EDIT # 1] - "SubscriptionId" se révèle être l'ID d'abonnement Azure trouvé dans la section facturation du portail, ne faisant PAS référence à l'abonnement au bus de service.

[EDIT # 2] - "namespaceName" n'inclut pas .servicebus.windows.net - juste le nom lui-même

Et avec ces changements, après d'innombrables heures de recherche, IL FONCTIONNE

17
Josh

Microsoft.Azure.ServiceBus.3.1.0 permet de créer un ManagementClient à l'aide de ConnectionString.

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

Le plan d'origine pour le nouveau client Azure Service Bus ne consistait pas du tout à inclure le plan de gestion et à utiliser à la place la route Azure Active Directory. Cela s'est révélé trop problématique, comme vous l'avez souligné. L'équipe de messagerie Microsoft a mis en place un exemple pour illustrer les opérations de base.

Notez qu'il y a un PR en attente pour le faire fonctionner avec .NET Core 2.0

À l'avenir, il a été reconnu que les développeurs préfèrent accéder à Service Bass à l'aide d'une chaîne de connexion comme ils le faisaient sur l'option Azure Active Directory. Problème des opérations de gestion est déclenché pour suivre les demandes. Plan actuel est de fournir une bibliothèque de gestion légère pour le client .NET Standard.

Pour l'instant, les options consistent à tirer parti de l'ancien client pour créer des entités ou à utiliser Microsoft.Azure.Management.ServiceBus (ou Fluent) jusqu'à ce que le package de gestion soit disponible.

Mise à jour

Les opérations de gestion ont été publiées dans le cadre de la version 3.1.0 du client.

5
Sean Feldman