将 USER_ID_PROPERTY 添加到 Hashtable 时,MQQueueManager 构造函数失败
MQQueueManager constructor fails when adding USER_ID_PROPERTY to Hashtable
基本上,我的工作任务涉及使用 IBM MQ 和 C#,虽然我擅长 C#,但在网络编程和 IBM MQ 方面我完全是个新手(因为我刚开始昨天使用 IBM MQ)。
无论如何,在阅读了大量指南和示例并解决了很多问题后,我设法制作了一个连接到 QueueManager 并成功发送和读取消息的 C# 解决方案。但是,我只能通过禁用默认授权来做到这一点,虽然当我需要做的只是测试我的适配器 class 时这很好,但我现在需要能够指定一个用户 ID 和一个密码,并最终恢复我禁用的所有授权设置。
问题是,每当我尝试将 USER_ID_PROPERTY 属性 添加到 connectionProperties 哈希表时,QMQueueManager 构造函数 returns 就会出现空引用系统异常。
这是我构建哈希表的代码;
Hashtable connectionProperties = new Hashtable();
// Add the connection type
connectionProperties.Add(MQC.TRANSPORT_PROPERTY, connectionType);
// Set up the rest of the connection properties, based on the connection type requested
switch (connectionType) {
case MQC.TRANSPORT_MQSERIES_BINDINGS: break;
case MQC.TRANSPORT_MQSERIES_CLIENT:
case MQC.TRANSPORT_MQSERIES_XACLIENT:
case MQC.TRANSPORT_MQSERIES_MANAGED:
//connectionProperties.Add(MQC.USER_ID_PROPERTY, "newUser");
connectionProperties.Add(MQC.HOST_NAME_PROPERTY, hostName);
connectionProperties.Add(MQC.PORT_PROPERTY, 1421);
connectionProperties.Add(MQC.CHANNEL_PROPERTY, channel);
connectionProperties.Add(MQC.CONNECTION_NAME_PROPERTY, connectionName);
break;
default:
Console.WriteLine(connectionType + " is not a valid connection type");
break;
}
return connectionProperties;
如果我 运行 按原样编写代码,一切正常,我连接到队列、发送、读取和断开连接都没有问题,当我取消注释使用 ID 行时,我得到以下行中的空引用系统异常;
qmQueueManager = new MQQueueManager(qManager, connectionProperties);
这是弹出的异常消息:
A System error occurred: System.NullReferenceException: Object reference not set to object instance.
At IBM.WMQ.MQQueueManager.Connect (String queueManagerName)
At IBM.WMQ.MQQueueManager..ctor (String queueManagerName, Hashtable properties)
At MQNetworkClient.MQManager.ConnectMQ (String details) Location C: \ Users \ A440 \ Documents \ Visual Studio 2017 \ Projects \ MQNetworkClient \ MQNetworkClient \ MQManager.cs: Line 124
At MQNetworkClient.MQManager.TryMQAction (MQSanityCheck sanityCheck, MQActionHandler mqAction, String details, String sanityFailMessage) Location C: \ Users \ A440 \ Documents \ Visual Studio 2017 \ Projects \ MQNetworkClient \ MQNetworkClient \ MQManager.cs: Line 95
错误消息并没有让我继续下去,虽然我检查了 QueueManager 的 AMQError 日志,但那里什么也没有写。
我真的很感激任何解决方案、变通方法或任何帮助追踪问题的方法,基本上,我很感激能得到任何可能为我指明正确方向的建议。
如果它有某种相关性,我正在使用 IBM MQ v9 和 Visual Studio 2017。
谢谢。
我认为您遇到了不同的问题。我一直在 C# .NET 中将 UserId 和密码设置为哈希表 属性,没有任何问题。看我的 post HERE.
尝试 different/lower .NET 框架版本。也就是说,您可能正在使用 IBM 不支持的软件。
这是产品缺陷(我也曾这样提出过)。基本上,如果您提供用户 ID,则必须提供密码,因为代码会取消引用密码字段,而无需先检查是否已提供...抱歉!
基本上,我的工作任务涉及使用 IBM MQ 和 C#,虽然我擅长 C#,但在网络编程和 IBM MQ 方面我完全是个新手(因为我刚开始昨天使用 IBM MQ)。
无论如何,在阅读了大量指南和示例并解决了很多问题后,我设法制作了一个连接到 QueueManager 并成功发送和读取消息的 C# 解决方案。但是,我只能通过禁用默认授权来做到这一点,虽然当我需要做的只是测试我的适配器 class 时这很好,但我现在需要能够指定一个用户 ID 和一个密码,并最终恢复我禁用的所有授权设置。
问题是,每当我尝试将 USER_ID_PROPERTY 属性 添加到 connectionProperties 哈希表时,QMQueueManager 构造函数 returns 就会出现空引用系统异常。
这是我构建哈希表的代码;
Hashtable connectionProperties = new Hashtable();
// Add the connection type
connectionProperties.Add(MQC.TRANSPORT_PROPERTY, connectionType);
// Set up the rest of the connection properties, based on the connection type requested
switch (connectionType) {
case MQC.TRANSPORT_MQSERIES_BINDINGS: break;
case MQC.TRANSPORT_MQSERIES_CLIENT:
case MQC.TRANSPORT_MQSERIES_XACLIENT:
case MQC.TRANSPORT_MQSERIES_MANAGED:
//connectionProperties.Add(MQC.USER_ID_PROPERTY, "newUser");
connectionProperties.Add(MQC.HOST_NAME_PROPERTY, hostName);
connectionProperties.Add(MQC.PORT_PROPERTY, 1421);
connectionProperties.Add(MQC.CHANNEL_PROPERTY, channel);
connectionProperties.Add(MQC.CONNECTION_NAME_PROPERTY, connectionName);
break;
default:
Console.WriteLine(connectionType + " is not a valid connection type");
break;
}
return connectionProperties;
如果我 运行 按原样编写代码,一切正常,我连接到队列、发送、读取和断开连接都没有问题,当我取消注释使用 ID 行时,我得到以下行中的空引用系统异常;
qmQueueManager = new MQQueueManager(qManager, connectionProperties);
这是弹出的异常消息:
A System error occurred: System.NullReferenceException: Object reference not set to object instance. At IBM.WMQ.MQQueueManager.Connect (String queueManagerName) At IBM.WMQ.MQQueueManager..ctor (String queueManagerName, Hashtable properties) At MQNetworkClient.MQManager.ConnectMQ (String details) Location C: \ Users \ A440 \ Documents \ Visual Studio 2017 \ Projects \ MQNetworkClient \ MQNetworkClient \ MQManager.cs: Line 124 At MQNetworkClient.MQManager.TryMQAction (MQSanityCheck sanityCheck, MQActionHandler mqAction, String details, String sanityFailMessage) Location C: \ Users \ A440 \ Documents \ Visual Studio 2017 \ Projects \ MQNetworkClient \ MQNetworkClient \ MQManager.cs: Line 95
错误消息并没有让我继续下去,虽然我检查了 QueueManager 的 AMQError 日志,但那里什么也没有写。
我真的很感激任何解决方案、变通方法或任何帮助追踪问题的方法,基本上,我很感激能得到任何可能为我指明正确方向的建议。
如果它有某种相关性,我正在使用 IBM MQ v9 和 Visual Studio 2017。
谢谢。
我认为您遇到了不同的问题。我一直在 C# .NET 中将 UserId 和密码设置为哈希表 属性,没有任何问题。看我的 post HERE.
尝试 different/lower .NET 框架版本。也就是说,您可能正在使用 IBM 不支持的软件。
这是产品缺陷(我也曾这样提出过)。基本上,如果您提供用户 ID,则必须提供密码,因为代码会取消引用密码字段,而无需先检查是否已提供...抱歉!