所以这是连接代码.
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,我会得到同样的错误.不明白为什么代码在一个应用程序中工作而不在另一个应用程序中.
这是因为异常设置,如果您查看 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)
问题解决了.它看起来像Exception设置一样简单.由于某种原因,控制台应用程序设置为不中断连接异常,并且WPF应用程序设置为中断.现在一切都有效.
奇怪的是,正在生成异常,特别是关于不解析服务器名称或IP地址,但它仍然有效.
归档时间: |
|
查看次数: |
2274 次 |
最近记录: |