我正在尝试关注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服务总线的任何想法?
答案 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上生成的。我的问题是临时问题?
答案 2 :(得分:0)
它似乎是我们的企业防火墙。它主动拒绝未知端口(9354)上的连接而不是被动地连接。这似乎使Azure的Microsoft库自动检测连接并切换到https。似乎在9354处主动拒绝连接时,会在库中抛出异常而不是尝试http。同样,如果我将模式设置为Http,它会挂起,但是当我在公司防火墙之外时,它不会挂起。如果这个库在端口9354上主动拒绝,那就太好了。