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

时间:2018-06-08 15:51:31

标签: c# .net 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"))));

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

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

3 个答案:

答案 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();