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
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.
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);