无法使用Microsoft.Azure.ServiceBus连接到Azure ServiceBus

我创建了一个非常简单的控制台应用程序,它连接到Azure ServiceBus并发送一条消息。 我尝试了Microsoft的最新库( Microsoft.Azure.ServiceBus ),但不管我做什么,我只是得到这个错误:

无法建立连接,因为目标计算机主动拒绝它ErrorCode:ConnectionRefused

我在Service Bus Explorer中尝试了完全相同的连接字符串,它确实工作正常。 此外,我使用Microsoft的旧库( WindowsAzure.ServiceBus )连接没有问题。

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

我尝试使用.NET Framework 4.6.2和Core,同样的例外。 我怀疑这些库使用的默认协议可能存在一些差异,但我无法确定这一点。

PS尝试过Microsoft文档中的示例,但结果仍然是相同的例外

旧客户端使用TCP,HTTP,HTTPS和AutoDetect支持ConnectivityMode 。 ServiceBus Explorer使用AutoDetect ,首先尝试TCP,然后故障转移到HTTPS,无论您使用的是什么TransportMode (SBMP或AMQP)。

随着新客户端的改变。 TransportMode现在结合了两个选项并提供Amqp (基于TCP的AMQP)或AmqpWebSockets (基于WebSockets的AMQP)。 没有AutoDetect模式。 您必须创建客户端并将TransportType指定为AmqpWebSockets以绕过被阻止的TCP端口5671,而是使用端口443。

似乎文档在如何使用HTTPS(Amqp over WebSockets)上进行连接方面缺乏很多,但在接受了 Sean Feldman的帮助后,我设法连接了。 以下是我感兴趣的代码:

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

或者让你将整个连接字符串整合在一起的变体

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

实际上可以直接使用ConnectionString,但必须扩充它才能使用正确的协议。

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

或者允许将EntityPath嵌入ConnectionString的版本

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