RabbitMQ创建连接问题 - 在一个应用程序中工作但在另一个应用程序中不起作用

9
所以这里是连接代码。
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);
        }

我在控制台应用程序中进行了测试,一切正常,我可以发送和接收消息。

如果我将上面的相同代码复制并粘贴到我的 WPF 应用程序中,则会在此处引发异常

connection = factory.CreateConnection()

异常

抛出异常: 'System.ArgumentException' in RabbitMQ.Client.dll

额外信息: 无法为myserver解析IP地址

如果我将"myserver"更改为服务器IP,我仍然会得到相同的错误。不理解为什么代码在一个应用程序中可以工作而在另一个应用程序中却不能。


你正在尝试访问哪个API URL?同时展示CreateConnection()函数内的代码。 - Souvik Ghosh
我没有展示代码,因为我认为它不相关,代码并没有执行到那一步。API网址?我不知道。我正在使用像这样的教程,它没有提到API网址。https://www.rabbitmq.com/tutorials/tutorial-four-dotnet.html - Gaz83
API URL 是我们向 MQ 发送消息的地方。我可以向您展示一个样例代码来建立连接并 POST 一条消息,但不确定这是否有帮助。因此,我想看看您是如何创建连接的。 - Souvik Ghosh
哦,对了,我不知道URL是什么。我想象RabbitMQ .net客户端会创建它。正如你从我的代码中看到的,我没有在任何地方输入URL,在控制台应用程序中也可以正常工作。 - Gaz83
你的MQ是否在不同的机器上运行?如果是,请检查您是否能够使用它的IP地址ping到该机器。URL类似于此- http://<IP或机器名称>:<端口号>/rpa/api/message - Souvik Ghosh
显示剩余2条评论
3个回答

12

问题解决了。看起来问题非常简单,只是异常设置的问题。由于某种原因,控制台应用程序设置为不在连接异常时中断,而 WPF 应用程序设置为在连接异常时中断。现在一切都正常工作了。

异常被生成似乎很奇怪,尤其是关于无法解析服务器名称或 IP 地址,但仍然可以运行。


1
很高兴你找到了它。 - Souvik Ghosh
你改变了哪个异常设置?我遇到了同样的问题。 - John
@Gaz83,你做了哪些更改来解决这个问题?我遇到了类似的麻烦,但是是针对控制台应用程序。 - Valerian Pereira
@ValerianPereira 抱歉这是很久以前的事了。根据我的回答,我唯一能给出的建议是运行控制台应用程序并在Visual Studio的输出窗口中观看。异常将在那里显示。然后更改设置以停止该类型。 - Gaz83

8

这是因为异常设置。如果你查看RMQ .net客户端源代码,一开始它会尝试使用IPv6协议连接你的IP地址,如果你连接的是IPv4地址,则此步骤将失败并抛出System.ArgumentException: No ip address could be resolved for 'your ip address'异常,但RMQ .net客户端将捕获此异常,并继续尝试使用IPv4协议连接你的IP地址。

 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);
        }

如果你设置了断开连接异常,那么你会强制抛出 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);
        }

感谢您发布有问题的代码和清晰的解释。您的回答是我在网络上唯一发现实际解释这个问题的地方。 - jjxtra
将异常用作正常控制流程只是令人讨厌的。感谢您的回答。 - JerMah

0

我通过在Visual Studio中禁用Just My Code并运行应用程序来解决了CreateConnection问题。由于Masstransit在网络库中使用throws功能,这首先让我走了错误的方向。这让我感觉我的配置设置有误或者我的服务没有运行,因此无法访问。

经过一次顽固的额外F5操作,我得到了一个错误,即无法加载程序集System.Threading.Tasks.Extensions。我为它添加了一个绑定重定向,然后一切都像应该的那样工作了:

<dependentAssembly>
    <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1"/>
</dependentAssembly>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接