【发布时间】:2020-08-22 09:31:45
【问题描述】:
这几天我一直在用头撞墙。
我在 docker 中设置了一个非常基本的 rabbitMQ 服务。我可以编写一个简单的控制台应用程序来写入和读取该服务。我也可以访问rabbitMQ门户网站。
但是,当我尝试在我正在开发的一个相当复杂的 Web 应用程序中使用它时,每次在 factory.CreateConnection() 方法上都会失败,并出现 None of the specified endpoints were reachable 错误。我的第一个想法是从 IISExpress 访问时出现问题。所以,我尝试了以下方法来确定我哪里出错了:
- 从新的 MVC ASP 应用程序中尝试 - 这很有效。
- 在开启 SSL 的全新 MVC ASP 应用程序中尝试 - 这很有效。
所以现在我知道它可以在控制台中使用,并且可以通过 IISExpress 使用和不使用 SSL。然后我在 failing 应用程序中尝试了以下操作(剧透,这些都不起作用):
- 将
CreateConnection()代码移到构造函数之外,这样它就不会被 Ninject 实例化。 - 在配置文件中将 loopback_users 设置为 none。
- 创建具有不同权限级别的新用户(通过门户网站和定义.json),并在连接方法中使用它们。
- 为新用户创建新的虚拟主机,并尝试在有和没有他们的情况下进行连接。
- 更改超时时间。
在每种情况下,我都会得到相同的结果。通过工作应用程序(使用相同的代码)时,我在输出中得到以下结果:
rabbitMQTest_1 | 2020-08-21 16:24:28.820 [info] <0.11124.0> accepting AMQP connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672)
rabbitMQTest_1 | 2020-08-21 16:24:28.899 [info] <0.11124.0> connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672): user 'testuser' authenticated and granted access to vhost 'test-vhost'
rabbitMQTest_1 | 2020-08-21 16:24:28.983 [info] <0.11124.0> closing AMQP connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672, vhost: 'test-vhost', user: 'testuser')
当尝试通过失败的应用程序时,我得到了这个:
rabbitMQTest_1 | 2020-08-21 16:26:30.640 [info] <0.11354.0> accepting AMQP connection <0.11354.0> (198.19.0.1:57202 -> 198.19.0.2:5672)
rabbitMQTest_1 | 2020-08-21 16:26:40.613 [error] <0.11354.0> closing AMQP connection <0.11354.0> (198.19.0.1:57202 -> 198.19.0.2:5672):
rabbitMQTest_1 | {handshake_timeout,frame_header}
工作应用程序和非工作应用程序之间的唯一区别是后者具有通过内部应用程序进行的安全登录和身份验证。
作为参考,这是我的 docker.yml 文件:
version: '3.4'
services:
rabbitMQTest:
image: rabbitmq-local
hostname: localhost
build:
context: .
dockerfile: Dockerfile
ports:
- 15672:15672
- 5672:5672
我的 Docker 文件:
FROM rabbitmq:3-management
ADD rabbitmq.conf /etc/rabbitmq/
ADD definitions.json /etc/rabbitmq/
RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/definitions.json
RUN rabbitmq-plugins enable rabbitmq_management
CMD ["rabbitmq-server"]
我的配置文件:
loopback_users = none
# IPv4
listeners.tcp.default = 5672
## HTTP listener and embedded Web server settings.
management.tcp.port = 15672
# Load queue definitions
management.load_definitions = /etc/rabbitmq/definitions.json
#Ignore SSL
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
这是用于连接和写入 rabbitMQ 的标准 C# 代码:
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost", UserName = "testuser", Password = "testpassword", VirtualHost = "test-vhost"};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare("MyExchange", "direct", true);
channel.QueueDeclare(queue: "MyQueue",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
channel.QueueBind("MyQueue", "MyExchange", "routingKey");
var message = "Howdy";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
routingKey: "routingKey",
basicProperties: null,
body: body);
Console.WriteLine(" [x] Send {0}", message);
}
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
正如我所说,我现在能想到的唯一区别是我的非工作应用程序具有这种其他人没有的内部身份验证。我不知道这是否有区别。我现在需要做的是深入挖掘。有谁知道从rabbitMQ获取更多日志信息的方法?特别是,在握手拒绝举行的那 10 秒内发生了什么?它只是在没有任何信息的情况下下降的事实让我发疯了!
或者,如果有人直接回答这个问题,我将不胜感激!
谢谢。
【问题讨论】:
标签: c# asp.net-mvc docker rabbitmq