【问题标题】:Passing URI to RabbitMQ将 URI 传递给 RabbitMQ
【发布时间】:2016-04-07 17:55:48
【问题描述】:

我正在使用以下代码连接到 RabbitMQ

factory.UserName = "userid";
factory.Password = "mypass@25";
factory.VirtualHost = "/filestream";
factory.Port = AmqpTcpEndpoint.UseDefaultPort;
factory.HostName = "myrabbitserver";
return factory.CreateConnection();

我想将连接设置更改为以下格式:

amqp://userid:mypass@25@myrabbitserver:5672/filestream

我的密码包含 @ 字符,因此我无法传递 URI

var factory = new ConnectionFactory();
factory.Uri = "amqp://userid:mypass@25@myrabbitserver:5672/filestream";

我最终手动提供工厂的每个属性。有没有一种方法可以告诉 RabbitMQ 我的密码有@,方法如下?

factory.Uri = "amqp://userid:"mypass@25"@myrabbitserver:5672/filestream";

如果我尝试将密码中的@更改为%40,获取连接时会报错

None of the specified endpoints were reachable

【问题讨论】:

  • 也许使用 %40 作为@符号? factory.Uri = "amqp://userid:mypass%4025%40myrabbitserver:5672/filestream";?或者,也可以在字符串上调用 UrlEncode 方法并将其分配给 factory.Uri,例如 factory.Uri = HttpUtlility.UrlEncod(<uriString>);。第二种方法的优点是可以转义 Uri 中的所有特殊字符。
  • 我也试过了,但是如果我添加任何特殊字符或编码,它不允许为 Uri 设置值;
  • 在密码中对@ 使用 %40 怎么样,而不是在 amqp uri 规范中使用@ 怎么样?
  • 我不知何故认为这是 RabbitMQ 的问题,但不是格式化;但我已经试过了

标签: c# rabbitmq


【解决方案1】:

你可以试试这个:-

 string rabbitmqconnection = $"amqp://{HttpUtility.UrlEncode("username")}: 
 {HttpUtility.UrlEncode("password")}@{"hostname"}
 /{HttpUtility.UrlEncode("/vhost")}";

希望这能解决您的问题。

【讨论】:

    【解决方案2】:

    您需要将URLEncode 转换为密码中的符号@

    根据你的情况,可以试试这个uri:

    amqp://userid:mypass%4025@myrabbitserver:5672/filestream
    

    【讨论】:

      【解决方案3】:

      显然,没有办法对密码中的@ 字符进行编码或转义。我更改了用户的密码以避免这个字符,一切都按预期工作。

      【讨论】:

        【解决方案4】:

        我能够将本机编码器导入我的代码:

        import java.net.URLEncoder;
        

        然后,对我的带有特殊字符的变量(包括我的虚拟主机,因为'/'字符)运行“编码”方法:

        String un_encoded = URLEncoder.encode(username); 
        String pw_encoded = URLEncoder.encode(password); 
        String vhost_encoded = URLEncoder.encode(virtualHost);
        

        这样做允许我在我的 ConnectionFactory 工厂对象上运行 setUri 方法。

        【讨论】:

          【解决方案5】:

          我强烈建议将您的 rabbit 连接字符串信息放入您的 web.config 或 app.config 中,就在您的 DB 连接字符串旁边。然后,您可以按如下方式使用它们:

          web.config 条目

            <connectionStrings>
               <add name="RabbitMQ" connectionString="amqp://{username}:{password}@{server}/{vhost}" />
            </connectionStrings>
          

          C#代码(以Ninject为例)

          Bind<IConnection>()
              .ToMethod(ctx =>
                          {
          var connectionString = configurationManager.ConnectionStrings["RabbitMQ"].ConnectionString;
                              var factory = new ConnectionFactory
                                          {
                                              Uri = ConnectionString,
                                              RequestedHeartbeat = 15,
                                              //every N seconds the server will send a heartbeat.  If the connection does not receive a heartbeat within
                                              //N*2 then the connection is considered dead.
                                              //suggested from http://public.hudl.com/bits/archives/2013/11/11/c-rabbitmq-happy-servers/
                                              AutomaticRecoveryEnabled = true
                                          };
          
                              return factory.CreateConnection();
                          })
              .InSingletonScope();
          

          当你这样做时,你不需要连接字符串中的“5672/filestream”。当连接字符串以“amqp://”

          开头时,隐含 5672

          【讨论】:

          • 我只在 App.config 中尝试;我粘贴在这里以方便其他人参考;您的语法 ins 配置仍在使用 @server/vhost;你的意思是我删除 /vhost?
          • vhost(虚拟主机)是rabbit中的一个概念,用于为不同的用户分离不同的队列。如果你不需要它,你可以省略它。此外,我的代码在 web.config 或 app.config 中都很好用
          • 您的密码中有@符号吗?
          • 不,@符号是密码和服务器名称的分隔符
          • 是的,我的密码中也有@;这导致了 RabbitMQ 的混乱
          【解决方案6】:
          factory.VirtualHost = "/filestream"; //this has char '/' should change to '%2f'
          
          factory.Uri = "amqp://userid:mypass%4025@myrabbitserver:5672/%2ffilestream";
          

          【讨论】:

          • “为什么”是什么意思?
          猜你喜欢
          • 1970-01-01
          • 2011-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-11
          相关资源
          最近更新 更多