【问题标题】:RabbitMQ CreateConneciton issues - works in one app but not in anotherRabbitMQ CreateConneciton 问题 - 在一个应用程序中有效,但在另一个应用程序中无效
【发布时间】:2017-01-03 10:36:22
【问题描述】:

所以这里是连接代码。

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()

例外

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

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

如果我将“myserver”更改为服务器 ip,我会得到同样的错误。 不明白为什么代码在一个应用程序中有效,而在另一个应用程序中无效。

【问题讨论】:

  • 您尝试访问的 API URL 是什么?同时显示 CreateConnection() 函数中的代码。
  • 我没有显示代码,因为我认为它不相关,代码没有那么远。 API 网址?我没有头绪。我正在使用这样的教程,它没有提到 API url。 rabbitmq.com/tutorials/tutorial-four-dotnet.html
  • API URL 是我们将消息发布到 MQ 的位置。我可以向您展示一个示例代码来建立连接并发布消息,但不确定这是否会有所帮助。所以我想看看你是如何创建连接的。
  • 哦,对了,我不知道网址。我想象 RabbitMQ .net 客户端创建。从我的代码中可以看出,我没有在任何地方输入 url,它在控制台应用程序中运行良好。
  • 您的 MQ 是否在另一台机器上运行?如果是,请检查您是否能够使用它的 IP ping 那台机器。 URL 是这样的 - http://:/rpa/api/message

标签: c# wpf rabbitmq


【解决方案1】:

问题解决了。看起来就像异常设置一样简单。出于某种原因,控制台应用程序设置为不中断连接异常,而 WPF 应用程序设置为中断。现在一切正常。

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

【讨论】:

  • 很高兴你找到它。
  • 您更改的异常设置是什么?我遇到了同样的问题
  • @Gaz83 你做了什么改变来解决这个问题?我面临着类似的麻烦,但控制台应用程序改为。
  • @ValerianPereira 抱歉,这是很久以前的事了。根据我的回答,我能给出的唯一建议是运行控制台应用程序并在 Visual Studio 中观看输出窗口。异常将显示在那里。然后更改设置以中断该类型。
【解决方案2】:

之所以这样做是因为异常设置,如果您查看 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);
        }

【讨论】:

  • 感谢您发布违规代码并提供清晰的解释。你的答案是我发现的唯一一个能真正解释这一点的网上地方。
  • 使用异常作为正常的控制流只是烦人。谢谢你的回答。
【解决方案3】:

我通过在 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>

【讨论】:

    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2018-03-29
    • 2022-01-23
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多