将 URI 传递给 RabbitMQ

Passing URI to RabbitMQ

我正在使用以下代码连接到 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

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

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

您需要URLEncode到密码中的符号@

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

amqp://userid:mypass%4025@myrabbitserver:5672/filestream
factory.VirtualHost = "/filestream"; //this has char '/' should change to '%2f'

factory.Uri = "amqp://userid:mypass%4025@myrabbitserver:5672/%2ffilestream";

显然,无法对密码中的 @ 字符进行编码或转义。我为用户更改了密码以避免出现此字符,一切都按预期进行。

你可以试试这个:-

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

希望这能解决您的问题。

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

import java.net.URLEncoder;

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

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

这样做让我可以 运行 我的 ConnectionFactory 工厂对象上的 setUri 方法。