我有两个控制台应用程序, A 和 B 。 应用程序 A 是为测试目的而创建的,并按预期工作。 应用程序 B 不起作用,尽管它基本上是 A 代码的复制粘贴:
System.Console.Write("User Name: ");
string username = System.Console.ReadLine();
System.Console.Write("Password: ");
string password = ConsoleReadPassword();
System.Console.WriteLine();
//user and password required because I am also a privileged user
//(member of mqm group)
MQEnvironment.UserId = username;
MQEnvironment.Password = password;
//for application B this line throws exception with code 2538
var queueManager = new MQQueueManager("TEST.QUEUE.MANAGER", "CLIENT.CONN.CHANNEL", "localhost(1414)");
错误代码2538表示"Host not available",这很奇怪,因为应用程序 A 连接到同一主机时没有问题。
这是MQ Server在MQ Explorer中的外观:
频道授权记录:
默认通道验证记录,可防止MQ管理员连接到队列管理器。它略有修改(添加了~
前缀)所以现在它不会阻止任何人。
MQ服务器和应用程序在同一台计算机上运行,因此排除了imho网络问题。
队列管理器错误日志不报告任何错误,但一般错误日志如下所示:
08/02/2016 15:15:23 - 流程(13720.10)用户([用户名]) 程序(B.EXE)AMQ9202:远程主机' localhost(1414)'不 可用,稍后再试。
说明:尝试使用TCP / IP分配对话 host' localhost(1414)'对于频道(例外)未成功。 然而,错误可能是暂时的,并且可能是错误的 稍后成功分配TCP / IP对话。
对于这两个应用程序,我使用相同版本的amqmdnet.dll
:8.0.0.4
程序A和B都有相同的目标框架:4.5
在测试时,我没有尝试同时运行这两个应用程序,如果通道是免费的(非活动),我在MQ Explorer中检查。
我还尝试更改生成的程序集的名称,但没有效果。
有谁知道什么可能导致应用 B 无法连接?
答案 0 :(得分:0)
当使用主机名localhost
仍然涉及网络时,它只发生在一台机器内。如果应用程序A与队列管理器在同一台机器上运行,那么使用连接名称localhost(1414)
进行应用程序A连接肯定会有效,但是没有必要像这样建立连接(即使用TCP / IP)而是建立一个本地绑定连接。
另一方面,如果您使用的是TCP / IP,因为应用程序B正在运行队列管理器的其他计算机上运行,那么使用localhost(1414)
将无效,因为localhost
机器无法连接到另一台机器上的localhost
。您应该从localhost(1414)
更改应用程序连接名称中指定的内容,以使用队列管理器计算机的IP地址(或主机名)(如前所述,使用端口号)。
答案 1 :(得分:0)
虽然我无法找到问题的原因,但解决方案只是
删除并重新创建项目。
这是我之前尝试的,是什么促使我采取这一行动:
我将 C 项目重命名为 B - 仍然有效
*非工作项目的名称包含一个点,所以我认为这可能会导致问题 - 事实并非如此。