Impossible de se connecter à Azure ServiceBus avec Microsoft.Azure.ServiceBus

J’ai créé une application console très simple qui se connecte à Azure ServiceBus et envoie un message. J’ai essayé la dernière bibliothèque de Microsoft ( Microsoft.Azure.ServiceBus ) mais peu importe ce que je fais, je reçois juste cette erreur:

Aucune connexion n’a pu être établie car la machine cible l’a activement refusée. ErrorCode: ConnectionRefused

J’ai essayé exactement la même chaîne de connexion dans Service Bus Explorer et cela fonctionne parfaitement. De plus, je me suis connecté sans problèmes en utilisant l’ancienne bibliothèque de Microsoft ( WindowsAzure.ServiceBus ).

 var sender = new MessageSender("endpoint", "topicName"); sender.SendAsync(new Message(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject("test")))); 

J’ai essayé avec .NET Framework 4.6.2 et Core, même exception. Je soupçonne que le protocole par défaut utilisé par ces bibliothèques peut présenter certaines différences, mais je n’en suis pas sûr.

PS ont essayé l’exemple de Microsoft docs mais le résultat est toujours la même exception

L’ancien client prenait en charge ConnectivityMode via TCP, HTTP, HTTPS et AutoDetect . ServiceBus Explorer utilise AutoDetect . Il AutoDetect essayer TCP, puis sur HTTPS, quel que soit le mode de TransportMode utilisé (SBMP ou AMQP).

Avec le nouveau client, cela a changé. TransportMode combine maintenant les deux options et offre Amqp (AMQP sur TCP) ou AmqpWebSockets (AMQP sur WebSockets). Il n’y a pas de mode AutoDetect . Vous devrez créer vos clients et spécifier TransportType comme AmqpWebSockets pour contourner le port TCP bloqué 5671 et utiliser le port 443.

Il semble que la documentation manque beaucoup sur la façon de se connecter avec HTTPS (Amqp over WebSockets), mais après l’aide de Sean Feldman dans la réponse acceptée, j’ai réussi à me connecter. Voici le code que j’ai utilisé si quelqu’un est intéressé:

 var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider( "RootManageSharedAccessKey", // SharedAccessKeyName "SomeToken"); var sender = new MessageSender( "sb://mydomain.servicebus.windows.net/", "topicName", tokenProvider, TransportType.AmqpWebSockets); 

Ou une variante qui vous permet d’avoir toute la chaîne de connexion en un seul morceau

 var builder = new ServiceBusConnectionSsortingngBuilder("YouConnectionSsortingng"); var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider( builder.SasKeyName, builder.SasKey); var sender = new MessageSender( builder.Endpoint, "TopicName", tokenProvider, TransportType.AmqpWebSockets); 

Il est en fait possible d’utiliser ConnectionSsortingng directement, mais il faut ensuite l’append pour utiliser le bon protocole.

 var sender = new MessageSender("TransportType=AmqpWebSockets;Endpoint=...", "TopicName") 

Ou la version qui permet d’intégrer EntityPath dans ConnectionSsortingng

 var connectionBuilder = new ServiceBusConnectionSsortingngBuilder("EntityPath=MyTopic;TransportType=AmqpWebSockets;Endpoint=...") var sender = new MessageSender(connectionBuilder);