我创建了一个非常简单的控制台应用程序,它连接到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,同样的例外。我怀疑这些库使用的默认协议可能存在一些差异,但我无法确定这一点。
P.S。尝试了Microsoft docs中的示例,但结果仍然是相同的异常
答案 0 :(得分:7)
旧客户端使用TCP,HTTP,HTTPS和AutoDetect
支持ConnectivityMode
。 ServiceBus资源管理器正在使用AutoDetect
,先尝试TCP,然后故障转移到HTTPS,无论您使用的是TransportMode
(SBMP还是AMQP)。
新客户端已经改变了。 TransportMode
现在结合了两个选项和商品Amqp
(基于TCP的AMQP)或AmqpWebSockets
(基于WebSockets的AMQP)。没有AutoDetect
模式。您必须创建客户端并将TransportType
指定为AmqpWebSockets
以绕过被阻止的TCP端口5671,而是使用端口443。
答案 1 :(得分:7)
似乎文档在如何使用HTTPS(Amqp over WebSockets)上进行连接方面缺乏很多,但是在accepted answer的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);
答案 2 :(得分:0)
我遇到了同样的问题,但他为我工作
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();