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

Cannot connect to Azure ServiceBus with Microsoft.Azure.ServiceBus

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

No connection could be made because the target machine actively refused it ErrorCode: ConnectionRefused

我在服务总线资源管理器中尝试了完全相同的连接字符串,它工作得很好。此外,我使用 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,同样的异常。我怀疑这些库使用的默认协议可能存在一些差异,但我不确定。

P.S。已尝试 Microsoft docs 中的示例,但结果仍然是相同的异常

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

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

文档似乎缺少很多关于如何使用 HTTPS(基于 WebSockets 的 Amqp)连接的文档,但在 中 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);

我遇到了同样的问题,但他对我有用

var clientOptions = new ServiceBusClientOptions();
clientOptions.TransportType = ServiceBusTransportType.AmqpWebSockets;
client = new ServiceBusClient(connectionString, clientOptions);
sender = client.CreateSender(topicName);
// create a batch 
using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();