2017-03-01 42 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