2016-08-08 102 views
1

我正嘗試使用我的.Net應用程序中的AMQP 1.0通道連接到IBM MQ 9.0。.Net適用於IBM MQ的AMQP客戶端

MQ Light門戶目前僅支持Nodejs,ruby,java和python客戶端。我們有.Net的MQ Light AMQP客戶端嗎?

我試圖連接到IBM MQ 9 Amqpnetlite客戶

namespace AMQPNetLiteSample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Start"); 
      //Address addr = new Address("10.58.139.97", 1234, "Username","password", "/", "AMQP"); 
      Address addr = new Address("amqp://10.58.139.97:1234"); 

      Connection con = new Connection(addr); 
      con.Closed += con_Closed; 
      Console.WriteLine("Created connection"); 

      Session session = new Amqp.Session(con); 
      session.Closed += session_Closed; 
      Console.WriteLine("Created session"); 

      SenderLink link = new SenderLink(session, "sender_12565455877", "/public"); 
      Console.WriteLine("Created link"); 
      var message = new Message(); 
      message.Properties = new Properties(); 
      message.Properties.Subject = "mysamplemsg"; 
      message.ApplicationProperties = new ApplicationProperties(); 
      message.ApplicationProperties["myprop"] = "Hello World"; 
      Console.WriteLine("sending message"); 
      link.Send(message); 

     } 

     static void session_Closed(AmqpObject sender, Error error) 
     { 
      Console.WriteLine("Session closed"); 
      Console.WriteLine(error.ToString()); 
     } 

     static void con_Closed(AmqpObject sender, Error error) 
     { 
      Console.WriteLine("Connection closed"); 
      Console.WriteLine(error.ToString()); 
     } 
    } 
} 

但我不能在建立連接成功。啓動SenderLink時,我得到2035個MQRC_NOT_AUTHORIZED異常。 但是,如果我使用MQ Light nodejs示例(send.js)嘗試使用IBM MQ 9.0 Server中的任何通道身份驗證,則可以連接並將消息發送到AMQP通道。

請建議上述代碼是否需要更改。

是否有人成功與任何其他.Net 1.0 AMQP客戶端建立了與IBM MQ的通信?在這裏需要你的幫助。謝謝。

+0

理論上任何AMQP客戶端都應該工作。您可以在MQ隊列管理器的錯誤日誌中找到有關NO_AUTHORIZED原因的詳細信息。 (AMQERR01.LOG) –

回答

3

似乎即使未配置用戶名和密碼,MQ代理也需要連接的SASL協商。您可以按如下所示在amqpnetlite上啓用SASL Anonymous。

Address address = new Address("amqp://10.58.139.97:1234"); 
Connection connection = new Connection(address, SaslProfile.Anonymous, null, null); 
Session session = new Session(connection); 
SenderLink sender = new SenderLink(session, "sender-12345", "/public"); 
Message message = new Message("Hello"); 
message.Properties = new Properties() { MessageId = "msg", To = "q1" }; 
sender.Send(message); 
connection.Close(); 

也可以對ConnectionFactory執行相同操作。

Address address = new Address("amqp://10.58.139.97:1234"); 
var factory = new ConnectionFactory(); 
factory.SASL.Profile = SaslProfile.Anonymous; 
Connection connection = await factory.CreateAsync(address); 
+0

謝謝。 SaslProfile是問題。該解決方案像一個魅力! – Sundar

+0

你應該在你的GitHub網站上發佈這個示例代碼。目前的示例代碼沒有提到這個要求。 –