web-dev-qa-db-fra.com

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 très bien. 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 ne pouvais pas le comprendre avec certitude.

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

12

L'ancien client supportait ConnectivityMode en utilisant TCP, HTTP, HTTPS et AutoDetect. L'Explorateur ServiceBus utilise AutoDetect, essayant TCP d'abord, puis basculant vers HTTPS, quel que soit le TransportMode que vous utilisiez (SBMP ou AMQP).

Avec le nouveau client, cela a changé. TransportMode combine désormais les deux options et propose 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 bloqué TCP port 5671 et utiliser à la place le port 443.

12
Sean Feldman

Il semble que la documentation manque beaucoup sur la façon de se connecter en utilisant HTTPS (Amqp sur WebSockets) mais après l'aide de Sean Feldman dans le 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 une seule pièce

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 ConnectionString directement, mais il doit ensuite être augmenté pour utiliser le bon protocole.

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

Ou la version qui permet d'incorporer EntityPath dans ConnectionString

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