代码之家  ›  专栏  ›  技术社区  ›  Ilya Chernomordik

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

  •  9
  • Ilya Chernomordik  · 技术社区  · 7 年前

    我创建了一个非常简单的控制台应用程序,它连接到azure servicebus并发送一条消息。我试过微软最新的库( Microsoft.Azure.ServiceBus )但不管我做什么我都会犯这个错误:

    无法建立连接,因为目标计算机处于活动状态 拒绝IT错误代码:连接被拒绝

    我在服务总线资源管理器中尝试了完全相同的连接字符串,它确实工作得很好。此外,我使用微软的旧库进行连接没有问题( 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 但结果还是一样

    2 回复  |  直到 6 年前
        1
  •  12
  •   Sean Feldman    7 年前

    支持的旧客户端 ConnectivityMode 使用tcp、http、https和 AutoDetect . ServiceBus资源管理器正在使用 自动检测 ,先尝试TCP,然后故障转移到https,而不管 TransportMode 你正在使用(sbmp或amqp)。

    有了新客户,情况就变了。 运输方式 现在结合了选项和选项 Amqp (TCP上的AMQP)或 AmqpWebSockets (WebSockets上的AMQP)。没有 自动检测 模式。您必须创建客户端并指定 TransportType 作为 AmqpWebSockets 要绕过被阻止的TCP端口5671,请使用端口443。

        2
  •  9
  •   Ilya Chernomordik    6 年前

    似乎文档中缺少很多关于如何使用https(amqp over websockets)进行连接的内容,但是在 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);