2017-03-01 59 views
0

我正在使用網絡中的c#程序,並且能夠將消息發佈到Azure服務總線隊列。收到它們時,我會在MessageReceiver.Receive()上遇到異常情況。代碼和錯誤在下面;Azure服務總線MessageReceiver Receive()網絡套接字錯誤

MessagingFactory factory = MessagingFactory.CreateFromConnectionString(QueueConnectionString); 

//Receiving a message 
MessageReceiver testQueueReceiver = factory.CreateMessageReceiver(QueueName); 

using (BrokeredMessage retrievedMessage = testQueueReceiver.Receive(new TimeSpan(0, 0, 20))) 
{ 
    try 
    { 
     var message = new StreamReader(retrievedMessage.GetBody<Stream>(), Encoding.UTF8).ReadToEnd(); 
     retrievedMessage.Complete(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
     retrievedMessage.Abandon(); 
    } 
} 

誤差會在

testQueueReceiver.Receive(...); 

扔在 '使用' 線服務器拒絕升級請求。 400此端點僅適用於網絡套接字請求

我在網上找不到任何東西,除了一個帖子似乎表明它是防火牆/端口問題。我在本地打開所有天藍色的服務總線端口(9350-9354,80,443),但有可能9000端口在防火牆處被阻塞。它是否需要這些?任何指針將不勝感激!

Service MessagingCommunication Exception - The End point is only for web socket requests

回答

0

由於一些代理問題,此問題已得到解決。

該代碼運行的帳戶是一個異步服務。我需要以該帳戶登錄,打開IE並轉到連接(LAN)並刪除代理複選框(自動檢測設置等)。一旦完成,代碼繞過代理並運行良好。

0

我只是想知道你爲什麼不使用OnMessage,而不是投票的隊列?

 var connectionString = ""; 
     var queueName = "samplequeue"; 

     var client = QueueClient.CreateFromConnectionString(connectionString, queueName); 

     client.OnMessage(message => 
     { 
     Console.WriteLine(String.Format("Message body: {0}", message.GetBody<String>())); 
     Console.WriteLine(String.Format("Message id: {0}", message.MessageId)); 
     message.Complete() 
     }); 
+0

此代碼是CRM插件的一部分。我相信CRM插件只有2分鐘的TTL。雖然它對於訂閱模式並不理想,但我們必須基本輪詢隊列。但是,我確實使用你的方法得到了完全相同的錯誤。 – creatiive

+0

就像你所說的那樣,你在本地打開了9354端口,但仍然有機會被防火牆阻止。你可以嘗試打開防火牆上的端口嗎? –

+0

我有9354出站允許通過防火牆和本地有相同的錯誤:-( – creatiive