環境: .NET 4.0, MQ .NET客戶端 IBM.XMS(v2.0.0.3)
測試代碼如下:
var factoryFactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ); var _connFactory = factoryFactory.CreateConnectionFactory(); _connFactory.SetStringProperty(XMSC.WMQ_HOST_NAME, "192.168.0.65"); _connFactory.SetIntProperty(XMSC.WMQ_PORT, 1414); _connFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "XPP_QM"); _connFactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT); _connFactory.SetIntProperty(XMSC.WMQ_BROKER_VERSION, XMSC.WMQ_BROKER_V1); _connFactory.SetStringProperty(XMSC.CLIENT_ID, string.Empty); var conn = _connFactory.CreateConnection(); conn.Start();
錯誤為:
IBM.XMS.XMSException: CWSMQ0006E: 調用方法 ConnectionFactory.CreateConnection 期間接收到了異常:CompCode: 2, Reason: 2538
。 在執行指定的方法期間,另一個組件拋出了異常。 有關更多信息,請參閱鏈接異常。
在 IBM.XMS.Client.WMQ.WmqConnectionFactory.CreateProviderConnection(XmsPropertyContext connectionProps)
在 IBM.XMS.Client.Impl.XmsConnectionFactoryImpl.CreateConnection(String userID, String password)
在 IBM.XMS.Client.Impl.XmsConnectionFactoryImpl.CreateConnection()
在 XRisk.MQ.MQConnection.Open(Boolean needLog) 位置 e:\xRisk4-src\XRisk.MQ\MQConnection.cs:行號 314
Linked Exception : CompCode: 2, Reason: 2538
真正的異常是下面的代碼中報的。
IBM.WMQ.MQTCPConnection ---- < ParseLocalAddress(String) exit [o] rc=OK IBM.WMQ.MQTCPConnection --- d Exception in method ConnectSocket(string,string,MQLONG) IBM.WMQ.MQTCPConnection --- X System.Net.Sockets.SocketException (0x80004005): The requested name is valid and was found in the database, but it does not have the correct associated data being resolved for at System.Net.Dns.InternalGetHostByAddress(IPAddress address, Boolean includeIPv6) at System.Net.Dns.GetHostEntry(String hostNameOrAddress) at IBM.WMQ.MQTCPConnection.ConnectSocket(String localAddr, String connectionName, Int32 options) MQException CompCode: 2 Reason: 2538
真實的原因是在.NET 4.0中,微軟改變了接口 Dns.GetHostEntry 的行為。當直接使用IP作為參數時就會變報,如果使用機器名或域名就不會報告。
解決方法如下
1. 使用 IPAddress.TryParse()或Dns.Resolve(string) 來代替Dns.GetHostEntry 。
2. 如果使用了第三方的庫,不能修改代碼,則可以把IP用機器名或域名代碼。如上面的代碼可以改成。
var factoryFactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ); var _connFactory = factoryFactory.CreateConnectionFactory(); _connFactory.SetStringProperty(XMSC.WMQ_HOST_NAME, "hostname"); _connFactory.SetIntProperty(XMSC.WMQ_PORT, 1414); _connFactory.SetStringProperty(XMSC.WMQ_QUEUE_MANAGER, "XPP_QM"); _connFactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT); _connFactory.SetIntProperty(XMSC.WMQ_BROKER_VERSION, XMSC.WMQ_BROKER_V1); _connFactory.SetStringProperty(XMSC.CLIENT_ID, string.Empty); var conn = _connFactory.CreateConnection(); conn.Start();
參考: