我正在尝试让 .Net 4.7.2 Web 应用程序连接到在 (Windows) Docker 容器中运行的 RabbitMQ 服务器(与运行 Web 应用程序的计算机在同一台计算机上)。
更新:使用非 Docker 版本的 RabbitMQ 也不能解决问题。控制台连接到非 Docker RabbitMQ 并可以发布消息,但 .Net 4.7.2 Web 应用程序仍然失败。
我使用 RabbitMQ.Client 6.2.4 (VMWare) 和以下连接代码:
ConnectionFactory connectionFactory = new ConnectionFactory();
Uri uri = new Uri("amqp://dan:dan@localhost:5672/");
connectionFactory.Uri = uri;
var theConnection = connectionFactory.CreateConnection();
(注意我也尝试过相同的结果:
var factory = new ConnectionFactory() { HostName = "localhost", Port = 5672, VirtualHost = "/", UserName = "dan", Password = "dan" };
using (var connection = factory.CreateConnection())
)
用户 dan 以管理员身份存在,并且拥有虚拟主机的权限。
我收到以下错误:
{"None of the specified endpoints were reachable"}
Data: {System.Collections.ListDictionaryInternal}
HResult: -2146232800
HelpLink: null
InnerException: {"connection.start was never received, likely due to a network timeout"}
Message: "None of the specified endpoints were reachable"
Source: "RabbitMQ.Client"
StackTrace: " at RabbitMQ.Client.ConnectionFactory.CreateConnection(IEndpointResolver endpointResolver, String clientProvidedName)\r\n at XXXX.Common.BackgroundSubmit.SubmitBackgroundProcess.<>c.<SubmitJob>b__0_0(String connectionURI) in C:\\XXXX.Common\\BackgroundSubmit\\BackgroundSubmitProcess.cs:line 71"
TargetSite: {RabbitMQ.Client.IConnection CreateConnection(RabbitMQ.Client.IEndpointResolver, System.String)}
RabbitMQ 日志报告此活动:
2022-05-18 02:18:59.346295+00:00 [info] <0.1164.0> accepting AMQP connection <0.1164.0> (172.19.0.1:55538 -> 172.19.0.2:5672)
2022-05-18 02:18:59.443173+00:00 [warning] <0.1164.0> closing AMQP connection <0.1164.0> (172.19.0.1:55538 -> 172.19.0.2:5672):
2022-05-18 02:18:59.443173+00:00 [warning] <0.1164.0> client unexpectedly closed TCP connection
我创建了一个小型控制台应用程序,该应用程序运行良好 - 它可以连接(并随后向队列生成消息)。该控制台应用程序是 .NET 6.0。
我尝试使用我的机器的实际 IP 地址以及 127.0.0.1,控制台已连接,但 Web 应用程序未连接。
我看了几张票,想也许这是一个很好的线索:
https://stackoverflow.com/questions/68011963/factory-createconnection-generates-a-none-of-the-specified-endpoints-were-reac
这表示确保 System.Threading.Tasks.Extension、System.Threading.Channels 和 System.Memory 在所有引用的项目中都是相同的版本,而且确实如此。
还尝试使用 rabbitmq_localdev 作为 URI 中的兔子主机名。
如有任何建议,我们将不胜感激!
谢谢,
D
这里是 docker-compose .yaml(如果有帮助的话):
version: "3.2"
services:
rabbitmq:
image: rabbitmq:3-management-alpine
container_name: 'rabbitmq'
ports:
- 5672:5672
- 15672:15672
# Expose 15672 for the management console, localhost:15672, guest/guest
# Expose 5672 for the qmpq port
# https://stackoverflow.com/questions/30747469/how-to-add-initial-users-when-starting-a-rabbitmq-docker-container
hostname: rabbitmq_localdev
volumes:
- ~/.docker-conf/rabbitmq/data/:/var/lib/rabbitmq/
- ~/.docker-conf/rabbitmq/log/:/var/log/rabbitmq
networks:
- rabbitmq_go_net
networks:
rabbitmq_go_net:
driver: bridge
对于那些将来登陆这里的人,我能够解决这个问题。
我的解决方案有多个项目。具有 RabbitMQ 连接功能的 MVC 项目将 RabbitMQ.Client 作为 NuGet 包,但另一个项目没有。我通过 NuGet 将 RabbitMQ.Client 添加到另一个项目中,它解决了问题。
我将重新表述已接受的答案。
如果您在
library 项目中有
RabbitMQ
客户端,请将 RabbitMQ.Client
Nuget 包的引用也添加到主项目的根目录(MVC 项目、作业、WCF 服务等)。这将解决问题。