RabbitMQ .NET 客户端中奇怪的“无法解析 IP 地址”

use*_*652 3 .net rabbitmq .net-core

我在 .NET Core 3.0 应用程序中遇到 RabbitMQ 客户端 v6.2.1 的奇怪问题。许多队列都被完美地消耗,但两个用于发送消息的队列会抛出“无法解析 XXX 的 ip 地址”,即使我指向直接 IP 地址而不是 XXX。它在我的代码示例的最后一行失败。我的 ConnectionFactory 定义有什么问题?我不使用 Ipv6,这是 100% 肯定的:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        ConnectionFactory connectionFactory = new ConnectionFactory
        {
            AutomaticRecoveryEnabled = true,
            NetworkRecoveryInterval = new TimeSpan(0, 0, 0, 0, settings.NetworkRecoveryIntervalInMs),
            HostName = settings.Host,
            TopologyRecoveryEnabled = true,
            Ssl = settings.UseSSL ? new SslOption
            {
                Enabled = true,
                Version = System.Security.Authentication.SslProtocols.Tls12,
                ServerName = settings.Host,
                CertPath = settings.Cert,
                CertPassphrase = settings.CertPassphrase,
                AcceptablePolicyErrors = SslPolicyErrors.RemoteCertificateNameMismatch | SslPolicyErrors.RemoteCertificateChainErrors
            } : null,
            VirtualHost = settings.VirtualHost,
            Port = int.Parse(settings.Port),
            UserName = settings.UserName,
            Password = settings.Password
        };

        return connectionFactory.CreateConnection(settings.ClientName);
Run Code Online (Sandbox Code Playgroud)

小智 9

不知道您是否解决了这个问题,我最近使用 RabbitMQ 的 Xamarin 应用程序也遇到了同样的问题。它尝试使用 AddressFamily.Unspecified 创建套接字,这是不允许的,它只会崩溃。结果就是这个神秘的“找不到 ip 地址”异常。如果您在使用连接工厂之前设置了默认地址族,那么它就可以正常工作:

ConnectionFactory.DefaultAddressFamily = AddressFamily.InterNetwork;
Run Code Online (Sandbox Code Playgroud)

或者

ConnectionFactory.DefaultAddressFamily = AddressFamily.InterNetworkV6;
Run Code Online (Sandbox Code Playgroud)

当然,您现在只能使用 IPv4 或 IPv6 地址,但这对我来说不是问题(至少现在不是)。