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