Azure ServiceBus在Client.Receive()上返回null

我有一个问题,从我在azure中设置的队列接收消息。 我以前使用相同的代码成功完成了这个,但现在我在尝试获取消息时只是为null。 当我在azure管理控制台中查看队列时,我清楚地看到队列包含5条消息。

这是代码:

ServiceBus SB = new ServiceBus(); Microsoft.ServiceBus.Messaging.BrokeredMessage message; while (true) { message = SB.ReceiveMessage("orders"); if (message == null) { break; } Procurement.Order order = message.GetBody(); order.id = Guid.NewGuid().ToString(); order.remindercount = 0; using (DbManager db = new DbManager()) { if (db.SetSpCommand("CreateOrderHead", db.Parameter("@companyId", order.companyId), db.Parameter("@orderId", order.orderId), db.Parameter("@suppliercode", order.suppliercode), db.Parameter("@supplierorderId", order.supplierorderId), db.Parameter("@orderdate", order.orderdate), db.Parameter("@desireddate", order.desireddate), db.Parameter("@ordertext", order.ordertext), db.Parameter("@name", order.name), db.Parameter("@street", order.street), db.Parameter("@zip", order.zip), db.Parameter("@city", order.city), db.Parameter("@country", order.country), db.Parameter("@countrycode", order.countrycode), db.Parameter("@deliveryterms", order.deliveryterms), db.Parameter("@reference", order.reference), db.Parameter("@deliveryinstruction", order.deliveryinstruction), db.Parameter("@id", order.id), db.Parameter("@partycode", order.partyCode) ).ExecuteNonQuery() == 1) { message.Complete(); message = null; } db.SetSpCommand("DeleteOrderRows", db.Parameter("@orderid", order.orderId), db.Parameter("@companyId", order.companyId) ).ExecuteNonQuery(); foreach (Procurement.Orderrow r in order.Orderrows) { db.SetSpCommand("CreateOrderRow", db.Parameter("@companyId", r.companyId), db.Parameter("@orderId", r.orderId), db.Parameter("@orderrowId", r.orderrowId), db.Parameter("@itemId", r.itemId), db.Parameter("@itemdesc", r.itemdesc), db.Parameter("@orderqty", r.orderqty), db.Parameter("@desireddate", r.desireddate), db.Parameter("@rowtext", r.rowtext), db.Parameter("@supplieritemId", r.supplieritemId), db.Parameter("@unit", r.unit), db.Parameter("@id", order.id), db.Parameter("@unitprice", r.unitprice), db.Parameter("@rowprice", r.rowprice) ).ExecuteNonQuery(); } } } Thread.Sleep(new TimeSpan(0, 1, 0)); 

这是ServiceBus类:

 public class ServiceBus { TokenProvider TokenProvider; MessagingFactory Factory; public ServiceBus() { TokenProvider = TokenProvider.CreateSharedSecretTokenProvider(GetIssuerName(), GetSecret()); Factory = MessagingFactory.Create( GetURINameSpace(), TokenProvider ); } public void SendMessage(string queue, BrokeredMessage message) { var client = Factory.CreateQueueClient(queue); client.Send(message); } public BrokeredMessage ReceiveMessage(string queue) { var client = Factory.CreateQueueClient(queue, ReceiveMode.ReceiveAndDelete); BrokeredMessage message = client.Receive(); return message; } private static Uri GetURINameSpace() { return ServiceBusEnvironment.CreateServiceUri("sb", GetNamespace(), string.Empty); } private static string GetNamespace() { return "Namespace i have verified its the right one"; } private static string GetIssuerName() { return "Issuer i have verified its the right one"; } private static string GetSecret() { return "Key i have verified its the right one"; } } 

我认为这应该是非常直接的,但我不知道我做错了什么。 它可能是一些小东西,我很遗憾…

无论如何,提前谢谢!

您在SubcriptionDescription.MessageCount中看到的那些BrokeredMessages不仅是常规消息,还包括$ DeadLetterQueue-sub队列中的消息计数!

使用此代码段从该子队列中检索所有邮件并打印出其详细信息。 将[主题]和[订阅]重命名为您的实际内容:

 MessagingFactory msgFactory = MessagingFactory.Create(_uri, _tokenProvider); MessageReceiver msgReceiver = msgFactory.CreateMessageReceiver("[topic]/subscriptions/[subscription]/$DeadLetterQueue", ReceiveMode.PeekLock); while (true) { BrokeredMessage msg = msgReceiver.Receive(); if (msg != null) { Console.WriteLine("Deadlettered message."); Console.WriteLine("MessageId: {0}", msg.MessageId); Console.WriteLine("DeliveryCount: {0}", msg.DeliveryCount); Console.WriteLine("EnqueuedTimeUtc: {0}", msg.EnqueuedTimeUtc); Console.WriteLine("Size: {0} bytes", msg.Size); Console.WriteLine("DeadLetterReason: {0}", msg.Properties["DeadLetterReason"]); Console.WriteLine("DeadLetterErrorDescription: {0}", msg.Properties["DeadLetterErrorDescription"]); Console.WriteLine(); msg.Complete(); } } 

这个问题的解决方案是azure管理门户网站中的一个错误,它会在队列中显示错误的消息数量,或者消息以某种方式被标记为不会被读取。 换句话说,它一直在工作,我只需要在队列中添加一些新消息。