RabbitMQ CreateConneciton问题 - 在一个应用程序中运行,但在另一个应用程序中运行

Gaz*_*z83 4 c# wpf rabbitmq

所以这是连接代码.

var factory = new ConnectionFactory
{
    HostName = "myserver",
    UserName = "testuser",
    Password = "testuserpassword"
};

using (var connection = factory.CreateConnection())
 using (var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: "LOG",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            string message = "Hello World!";
            var body = Encoding.UTF8.GetBytes(message);

            channel.BasicPublish(exchange: "",
                                 routingKey: "LOG",
                                 basicProperties: null,
                                 body: body);
            Console.WriteLine(" [x] Sent {0}", message);
        }
Run Code Online (Sandbox Code Playgroud)

我在一个控制台应用程序中测试它,一切正常,我可以发送和接收消息.

如果我然后将上面相同的代码复制并粘贴到我的WPF应用程序中,我会在这里得到一个例外

connection = factory.CreateConnection()
Run Code Online (Sandbox Code Playgroud)

例外

抛出异常:RabbitMQ.Client.dll中的"System.ArgumentException"

附加信息:myserver无法解析IP地址

如果我将"myserver"更改为服务器ip,我会得到同样的错误.不明白为什么代码在一个应用程序中工作而不在另一个应用程序中.

Dan*_*nyg 8

这是因为异常设置,如果您查看 RMQ .net 客户端源代码,一开始它会尝试将您的 IP 地址与 IPv6 协议连接,如果您正在连接 IPv4 地址,则此步骤将失败并抛出 System.ArgumentException :无法为“您的 ip 地址”解析任何 ip 地址,但 RMQ .net 客户端将捕获此异常并继续尝试将您的 ip 地址与 IPv4 协议连接。

 if (ShouldTryIPv6(endpoint))
        {
            try {
                m_socket = ConnectUsingIPv6(endpoint, socketFactory, connectionTimeout);
            } catch (ConnectFailureException)
            {
                m_socket = null;
            }
        }

        if (m_socket == null && endpoint.AddressFamily != AddressFamily.InterNetworkV6)
        {
            m_socket = ConnectUsingIPv4(endpoint, socketFactory, connectionTimeout);
        }
Run Code Online (Sandbox Code Playgroud)

如果您设置中断连接异常,则强制抛出 ArgumentException。

  public virtual async Task ConnectAsync(string host, int port)
    {
        AssertSocket();
        var adds = await Dns.GetHostAddressesAsync(host).ConfigureAwait(false);
        var ep = TcpClientAdapterHelper.GetMatchingHost(adds, sock.AddressFamily);
        if (ep == default(IPAddress))
        {
            throw new ArgumentException("No ip address could be resolved for " + host);
        }
Run Code Online (Sandbox Code Playgroud)


Gaz*_*z83 7

问题解决了.它看起来像Exception设置一样简单.由于某种原因,控制台应用程序设置为不中断连接异常,并且WPF应用程序设置为中断.现在一切都有效.

奇怪的是,正在生成异常,特别是关于不解析服务器名称或IP地址,但它仍然有效.