【问题标题】:MQQueueManager constructor fails when adding USER_ID_PROPERTY to Hashtable将 USER_ID_PROPERTY 添加到 Hashtable 时,MQQueueManager 构造函数失败
【发布时间】:2018-02-23 07:40:43
【问题描述】:

基本上,我的工作任务涉及使用 IBM MQ 和 C#,虽然我精通 C#,但在网络编程和 IBM MQ 方面我完全是新手(因为我几乎没有开始使用 IBM MQ 昨天)。

无论如何,在阅读了很多指南和示例,并解决了很多问题后,我设法制作了一个连接到 QueueManager 并成功发送和读取消息的 C# 解决方案。但是,我只能通过禁用默认授权来做到这一点,虽然当我需要做的只是测试我的适配器类时这很好,但我现在需要能够指定用户 ID 和密码,并最终恢复所有我禁用的授权设置。

但问题是,每当我尝试将 USER_ID_PROPERTY 属性添加到 connectionProperties Hashtable 时,QMQueueManager 构造函数都会返回 Null 引用系统异常。

这是我构建哈希表的代码;

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

这是弹出的异常信息:

发生系统错误:System.NullReferenceException:对象引用未设置为对象实例。 在 IBM.WMQ.MQQueueManager.Connect(字符串 queueManagerName) 在 IBM.WMQ.MQQueueManager..ctor(字符串 queueManagerName、Hashtable 属性) 在 MQNetworkClient.MQManager.ConnectMQ(字符串详细信息)位置 C:\Users\A440\Documents\Visual Studio 2017\Projects\MQNetworkClient\MQNetworkClient\MQManager.cs:第 124 行 在 MQNetworkClient.MQManager.TryMQAction (MQSanityCheck sanityCheck, MQActionHandler mqAction, String details, String sanityFailMessage) 位置 C:\Users\A440\Documents\Visual Studio 2017\Projects\MQNetworkClient\MQNetworkClient\MQManager.cs:第 95 行

错误消息并没有给我太多继续,当我检查了 QueueManager 的 AMQError 日志但没有写在那里。

我非常感谢任何解决方案、解决方法或任何帮助追踪问题,基本上,我很感激能得到任何可能为我指明正确方向的建议。

如果它在某种程度上相关,我使用 IBM MQ v9 和 Visual Studio 2017。

谢谢。

【问题讨论】:

标签: c# authentication ibm-mq


【解决方案1】:

我认为您有不同的问题。我一直在 C# .NET 中将 UserId 和 Password 设置为 Hashtable 属性,没有任何问题。请参阅我的帖子HERE

尝试不同/更低的 .NET 框架版本。即,您可能正在使用 IBM 不支持的一种。

【讨论】:

  • Hans Passant 的评论实际上解决了这个问题,但感谢您为我提供您帖子的链接,因为无论如何它肯定会有用。
【解决方案2】:

这是一个产品缺陷(我也提出过这样的问题)。基本上,如果您提供用户 ID,则必须提供密码,因为代码会取消对密码字段的引用,而无需先检查是否提供了密码……对不起!

【讨论】:

  • 这是作为内部缺陷还是 APAR 处理?
  • 内部缺陷,但如果您需要 APAR,请联系 IBM 支持。鉴于简单的解决方法,它不应该是真正需要避免的问题。注意我怀疑如果你只是提供了密码而不是用户名,你可能也会看到同样的结果
  • 感谢您提供的信息。 APAR 很有帮助,因为如果您发现问题并且不是最新版本,它们可以提供很好的参考。 1. 它会告诉你它在哪个修订包中得到更正, 2. 一个本地解决方法,直到你达到那个级别。这个 SO 问题将提供 #2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2016-12-18
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多