18 votes

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 quoi que je fasse, j'obtiens toujours cette erreur :

Aucune connexion n'a pu être établie car la machine cible a activement l'a 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ème 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 qu'il peut y avoir des différences dans le protocole par défaut que ces bibliothèques utilisent, mais je n'ai pas pu le déterminer avec certitude.

P.S. J'ai essayé l'exemple de Documents Microsoft mais le résultat est toujours la même exception

27voto

Sean Points 888

L'ancien client supportait ConnectivityMode en utilisant TCP, HTTP, HTTPS, et AutoDetect . ServiceBus Explorer utilise AutoDetect en essayant d'abord TCP puis en passant à HTTPS, sans tenir compte de l'option TransportMode que vous utilisiez (SBMP ou AMQP).

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

18voto

Ilya Chernomordik Points 419

Il semble que la documentation soit très lacunaire sur la façon de se connecter en utilisant HTTPS (Amqp over WebSockets) mais après avoir reçu l'aide de Sean Feldman dans l'équipe de l 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 ServiceBusConnectionStringBuilder("YouConnectionString");

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 directement ConnectionString, mais il faut alors l'enrichir pour utiliser le bon protocole.

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

Ou la version qui permet d'incorporer EntityPath dans la ConnectionString

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X