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

svgewumm  于 2023-06-06  发布在  其他
关注(0)|答案(3)|浏览(183)

我创建了一个非常简单的控制台应用程序,它连接到Azure服务总线并发送一条消息。我尝试了微软最新的库(Microsoft.Azure.ServiceBus),但无论我做什么,我只是得到这个错误:
无法建立连接,因为目标计算机主动拒绝连接错误代码:拒绝连接
我已经在服务总线资源管理器中尝试了完全相同的连接字符串,它确实工作得很好。此外,我使用微软的旧库(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的示例,但结果仍然是相同的异常

ztmd8pv5

ztmd8pv51#

旧客户端支持使用TCP、HTTP、HTTPS和AutoDetectConnectivityMode。ServiceBus Explorer正在使用AutoDetect,先尝试TCP,然后故障转移到HTTPS,而不管您使用的是什么TransportMode(SBMP或AMQP)。
但随着新客户的到来,情况发生了变化。TransportMode现在结合了这两个选项,并提供Amqp(基于TCP的AMQP)或AmqpWebSockets(基于WebSockets的AMQP)。没有AutoDetect模式。您必须创建客户端并将TransportType指定为AmqpWebSockets,以绕过被阻止的TCP端口5671,而使用端口443。

bq3bfh9z

bq3bfh9z2#

看起来文档中缺少很多关于如何使用HTTPS(Amqp over WebSockets)进行连接的内容,但在Sean Feldman在accepted answer中提供了一些帮助后,我成功地连接了。下面是我使用的代码,如果有人感兴趣:

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);
lmvvr0a8

lmvvr0a83#

我也有同样的问题,但这个对我有效

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

相关问题