QuotaExceededException: удаленный сервер возвратил ошибку: (403) Запрещено. Запрос был прерван из-за ограничения пространства имен XXX
При попытке получить список регистраций для моего центра уведомлений я получаю следующую ошибку:
[QuotaExceededException: The remote server returned an error: (403) Forbidden. The request was terminated because the namespace XXX is being throttled. Please wait 60 seconds and try again. TrackingId:c7e05299-24ba-4f9d-9017-885db746a032_G20,TimeStamp:11/19/2014 9:00:51 PM]
Microsoft.ServiceBus.Common.AsyncResult.End(IAsyncResult result) +624
Microsoft.ServiceBus.Messaging.ServiceBusResourceOperations.EndGetAll(IAsyncResult asyncResult, String& continuationToken) +12
Microsoft.ServiceBus.NamespaceManager.EndGetAllRegistrations(IAsyncResult result) +33
System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) +52
Это только тестовое приложение, поэтому количество устройств относительно невелико (~20), равно как и количество пользователей кода, который выдает исключение. Сообщение об ошибке, очевидно, указывает на то, что мы как-то превышаем нашу квоту, но я не могу сказать, в каком аспекте - ни один из показателей в концентраторах уведомлений, по-видимому, не превышает 100 операций за предыдущие 24 часа. Количество доступных операций в день должно быть намного больше, чем мы используем.
На портале Azure нигде нет информации о количестве операций, поэтому я не знаю, как найти причину этой проблемы.
Как ни странно, этот похожий вопрос - Azure QuotaExceededException - указывает на то, что они получили указание на количество операций Max и Allowed, но моя ошибка не показывает ничего подобного.
Есть ли способ (кроме платной поддержки Azure) узнать, почему меня душат?
2 ответа
Оказывается, в пакете NuGet для Microsoft.ServiceBus 2.1.2.0 есть ошибка, при которой вызов NotificationHubClient.GetAllRegistrations(10) некорректно извлекает только первые 10 регистраций, вместо этого он рекурсивно извлекает ВСЕ регистрации в блоках по 10. В моем случае получается, что было 250 регистраций (большинство из них были старыми), поэтому вызов API выполнялся 25 раз подряд (~5 секунд), что объясняет исключение QuotaExceededException.
Исправление заключалось в обновлении до последней версии пакета NuGet для Microsoft.ServiceBus - в настоящее время 2.5.2.0.
Получение всех регистраций рассматривается (и регулируется!) Как аналитическая операция. Это означает, что он не должен использоваться в вашем основном потоке времени выполнения. Или другими словами - если вам приходится часто это называть, значит что-то не так...
Опишите вашу заявку более подробно, и я буду рад помочь вам найти хороший пример использования NH.