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

Ily*_*dik 10 .net c# azure azureservicebus

我创建了一个非常简单的控制台应用程序,它连接到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"))));
Run Code Online (Sandbox Code Playgroud)

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

PS尝试过Microsoft docs中的示例,但结果仍然是同样的例外

Sea*_*man 12

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

随着新客户,这已经改变了.TransportMode现在结合了选项和提供Amqp(AMQP over TCP)或AmqpWebSockets(AMQP over WebSockets).没有AutoDetect模式.你必须创建你的客户,并指定TransportTypeAmqpWebSockets绕过阻塞的TCP端口5671,而使用443端口.

  • 我实际上已经找到了一种更简单的方法,我们可以使用以下协议扩展连接字符串:TransportType = AmqpWebSockets; ... (2认同)

Ily*_*dik 10

看来,文件缺乏有关如何使用HTTPS连接很多(AMQP过的WebSockets),但之后,从肖恩·费尔德曼在一些帮助接受的答案,我设法连接。如果有人感兴趣,这是我使用的代码:

var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(
    "RootManageSharedAccessKey", // SharedAccessKeyName
    "SomeToken");

var sender = new MessageSender(
    "sb://mydomain.servicebus.windows.net/",
    "topicName",
    tokenProvider,
    TransportType.AmqpWebSockets);
Run Code Online (Sandbox Code Playgroud)

或让您将整个连接字符串整合为一个的变体

var builder = new ServiceBusConnectionStringBuilder("YouConnectionString");

var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(
    builder.SasKeyName,
    builder.SasKey);

var sender = new MessageSender(
    builder.Endpoint,
    "TopicName",
    tokenProvider,
    TransportType.AmqpWebSockets);
Run Code Online (Sandbox Code Playgroud)

实际上可以直接使用ConnectionString,但随后必须对其进行扩充以使用正确的协议。

var sender = new MessageSender("TransportType=AmqpWebSockets;Endpoint=...", "TopicName")
Run Code Online (Sandbox Code Playgroud)

或允许将EntityPath嵌入ConnectionString的版本

var connectionBuilder = new ServiceBusConnectionStringBuilder("EntityPath=MyTopic;TransportType=AmqpWebSockets;Endpoint=...")
var sender = new MessageSender(connectionBuilder);
Run Code Online (Sandbox Code Playgroud)