Azure TopicClient.Send()从不发送消息并挂起

时间:2013-12-06 18:21:20

标签: c# azure servicebus azureservicebus

我正在尝试关注Windows Azure tutorial向Microsoft Azure服务总线上的主题发送消息。我创建了命名空间和主题。然后我设置了ACS并抓住了我的连接字符串。我的连接字符串允许管理,收听,发送。当我执行我的代码时,发送(消息)就会挂起。它永远不会超时,也不会继续。 CPU没有最大化,我可以打破代码并关闭程序。 Azure中没有消息到达。当我在小提琴手中观察我的网络流量时,我认为它永远不会完成身份验证协商。我看到一个帖子到我的命名空间.servicebus.windows.net,它返回201然后一个帖子和一个获取属于Azure服务总线的IP地址和/ $ servicebus / webstring / {guid}。这些Web请求都没有得到服务器的响应。这是我的代码。它停止在client.Send(message);

上运行
static void Main(string[] args)
    {
        ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Http;

        string connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];
        var client = TopicClient.CreateFromConnectionString(connectionString, "clients");
        Console.WriteLine(client.IsClosed);

        var message = new BrokeredMessage("Test message.") {TimeToLive = TimeSpan.FromMinutes(15)};
        client.Send(message);

        Console.WriteLine("Done");
        Console.ReadKey();
    }

有关如何使此代码将消息发布到Azure服务总线的任何想法?

3 个答案:

答案 0 :(得分:0)

我在使用此代码时也看到了这种行为,它似乎链接到您设置的ServiceBusEnvironment.SystemConnectivity.Mode。如果你评论它,它会通过。教程中未提及该模式。默认模式为Auto,它会检测是否可以先通过TCP发送。

话虽如此,我建议你改用以下代码:

string connectionString = ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"];

MessagingFactory factory = MessagingFactory.CreateFromConnectionString(connectionString);
MessageSender testQueue = factory.CreateMessageSender("TestTopic");

BrokeredMessage message = new BrokeredMessage("Test message ");
testQueue.Send(message);

直接使用MessageSender而不是TopicClient或QueueClient的好处之一是您的代码不关心目标是主题还是队列。如果您以后需要从一个更改为另一个,则此处的代码不必更改。同样,在消费代码上使用MessageReceiver也会更好。

答案 1 :(得分:0)

我没有看到这个问题,我可以在相同代码的主题上发布消息,并通过订阅接收它。我使用的SAS密钥是在Topic上生成的。我的问题是临时问题? Screenshot

答案 2 :(得分:0)

它似乎是我们的企业防火墙。它主动拒绝未知端口(9354)上的连接而不是被动地连接。这似乎使Azure的Microsoft库自动检测连接并切换到https。似乎在9354处主动拒绝连接时,会在库中抛出异常而不是尝试http。同样,如果我将模式设置为Http,它会挂起,但是当我在公司防火墙之外时,它不会挂起。如果这个库在端口9354上主动拒绝,那就太好了。