Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье перечислены исключения .NET, созданные устаревшими API .NET Framework для Служебная шина Azure. Для каждого исключения найдите причину и предлагаемое разрешение.
30 сентября 2026 г. мы выведем из эксплуатации библиотеки SDK Служебная шина Azure: WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus и com.microsoft.azure.servicebus, которые не соответствуют рекомендациям по Azure SDK. Мы также завершим поддержку протокола SBMP, поэтому вы больше не сможете использовать этот протокол после 30 сентября 2026 года. Перейдите в последние библиотеки пакета SDK Azure, которые предлагают критически важные обновления системы безопасности и улучшенные возможности до этой даты.
Хотя старые библиотеки по-прежнему могут использоваться после 30 сентября 2026 года, они больше не будут получать официальную поддержку и обновления от Майкрософт. Дополнительные сведения см. в объявлении о завершении технической поддержки.
Категории исключений служебная шина
API-интерфейсы обмена сообщениями создают исключения, которые могут относиться к следующим категориям, а также связанные с ними действия, которые можно предпринять, чтобы попытаться их исправить. Значение и причины исключения могут различаться в зависимости от типа объекта обмена сообщениями:
- Ошибка пользовательского кода (System.ArgumentException, System.InvalidOperationException, System.OperationCanceledException, System.Runtime.Serialization.SerializationException). Общее действие: попытайтесь исправить код, прежде чем продолжить.
- Ошибка установки и настройки (Microsoft. ServiceBus.Messaging.MessagingEntityNotFoundException, System.UnauthorizedAccessException). Общие действия: проверьте конфигурацию и при необходимости внесите в нее изменения.
- Временные исключения (Microsoft.ServiceBus.Messaging.MessagingException, Microsoft.ServiceBus.Messaging.ServerBusyException, Microsoft.ServiceBus.Messaging.MessagingCommunicationException). Общее действие: повторите операцию или уведомите пользователей. Класс
RetryPolicyв клиентском SDK можно настроить для автоматической обработки повторных попыток. Дополнительные сведения см. в разделе Руководство по повторным попыткам. - Другие исключения (System.Transactions.TransactionException, System.TimeoutException, Microsoft.ServiceBus.Messaging.MessageLockLostException, Microsoft.ServiceBus.Messaging.SessionLockLostException). Общие действия: специфичные для типа исключения; Обратитесь к таблице в следующем разделе:
Это важно
- Служебная шина Azure не выполняет повторную попытку операции, если при выполнении операции в контексте транзакции возникает исключение.
- Рекомендации по повторным попыткам, относящиеся к служебной шине Azure, см. в статье Рекомендации по повторным попыткам для служебной шины.
Типы исключений служебная шина и их устранение
В следующей таблице перечислены типы исключений обмена сообщениями и их причины, а также примечания к предлагаемым действиям, которые можно предпринять.
| Тип исключения | Описание/Причина/Примеры | Рекомендуемые действия | Примечание об автоматическом/немедленном повторе попытки |
|---|---|---|---|
| TimeoutException | Сервер не ответил на запрошенную операцию в течение указанного времени, контролируемого параметром OperationTimeout. Возможно, сервер выполнил запрошенную операцию. Это может произойти из-за задержек в работе сети или другой инфраструктуры. | Проверьте состояние системы на согласованность и при необходимости повторите попытку. Ознакомьтесь с исключениями для тайм-аута. | Повторная попытка может помочь в некоторых случаях. Добавьте в код логику повторных попыток. |
| InvalidOperationException (Исключение недопустимой операции) | Запрошенная пользователем операция не разрешается для выполнения в пределах сервера или службы. Подробные сведения см. в сообщении об исключении. Например, Complete() генерирует это исключение, если сообщение было получено в режиме ReceiveAndDelete. | Проверьте код и обратитесь к документации. Убедитесь, что запрошенная операция действительна. | Повторная попытка не помогает. |
| OperationCanceledException | Предпринята попытка вызвать операцию с объектом, который уже закрыт, прерван или удален. Иногда это означает, что внешняя транзакция уже удалена. | Проверьте код и убедитесь, что он не вызывает операции с использованием удаленного объекта. | Повторная попытка не помогает. |
| UnauthorizedAccessException | Объекту TokenProvider не удалось получить маркер, маркер недействителен или маркер не содержит утверждений, необходимых для выполнения операции. | Убедитесь, что поставщик токенов создан с правильными значениями. Проверьте конфигурацию Службы контроля доступа. | Повторная попытка может помочь в некоторых случаях. Добавьте в код логику повторных попыток. |
|
ArgumentException ArgumentNullException ArgumentOutOfRangeException |
Для этого метода предоставлен один или несколько недопустимых аргументов. URI, предоставленный NamespaceManager или Create , содержит сегменты пути. Для NamespaceManager или Create указана недопустимая схема URI. Значение свойства превышает 32 КБ. |
Проверьте вызывающий код и убедитесь, что аргументы заданы правильно. | Повторная попытка не помогает. |
| MessagingEntityNotFoundException | Сущность, связанная с операцией, не существует или была удалена. | Убедитесь, что сущность существует. | Повторная попытка не помогает. |
| MessageNotFoundException | Попытка получить сообщение с определенным порядковым номером. Это сообщение не найдено. | Убедитесь, что сообщение еще не получено. Проверьте очередь недоставленных сообщений, чтобы узнать, было ли сообщение отправлено как недоставленное. | Повторная попытка не помогает. |
| Исключение при обмене сообщениями | Клиенту не удается установить подключение к служебная шина. | Убедитесь, что имя хоста указано правильно и хост доступен. Если код выполняется в среде с брандмауэром или прокси-сервером, убедитесь, что трафик к домену/IP-адресу и портам служебной шины не заблокирован. |
Повторная попытка может помочь, если возникают периодические проблемы с подключением. |
| ServerBusyException | Служба не может обработать запрос. | Клиент может подождать некоторое время, а затем повторить операцию. | Клиент может повторить попытку через определенный интервал времени. Если повторная попытка приводит к другому исключению, проверьте поведение повтора этого исключения. |
| MessagingException | Универсальное исключение для обмена сообщениями, которое может быть создано в следующих случаях: Предпринимается попытка создать QueueClient с использованием имени или пути, которые принадлежат другому типу сущности (например, разделу). Предпринята попытка отправить сообщение размером более 256 КБ. Сервер или сервис столкнулись с ошибкой во время обработки запроса. Подробные сведения см. в сообщении об исключении. Обычно это временное исключение.Запрос был прекращён, так как для этого объекта применяется ограничение скорости. Код ошибки: 50001, 50002, 50008. |
Проверьте код и убедитесь, что для тела сообщения используются только сериализуемые объекты (или используйте пользовательский сериализатор). Ознакомьтесь с документацией на предмет поддерживаемых типов значений свойств и используйте только поддерживаемые типы. Проверьте свойство IsTransient . Если это так, вы можете повторить операцию. |
Если исключение связано с регулированием, подождите несколько секунд и повторите операцию. Поведение при повторной попытке не задано и может не помочь в других сценариях. |
| MessagingEntityAlreadyExistsException | Попытайтесь создать сущность с именем, которое уже используется другой сущностью в этом пространстве имен службы. | Удалите существующую сущность или выберите другое имя для создаваемой сущности. | Повторная попытка не помогает. |
| QuotaExceededException | Сущность обмена сообщениями достигла максимально допустимого размера или было превышено максимальное количество подключений к пространству имен. | Освободите место в сущности, получая сообщения из сущности или ее подочередей. См. QuotaExceededException. | Повторная попытка может помочь, если сообщения были удалены. |
| Исключение действия правила | служебная шина возвращает данное исключение, если вы пытаетесь создать недопустимое действие для правила. служебная шина добавляет это исключение к сообщению, помещённому в очередь недоставленных сообщений, если при обработке действия правила для этого сообщения возникает ошибка. | Проверьте правильность действия правила. | Повторная попытка не помогает. |
| FilterException (Исключение фильтра) | служебная шина возвращает это исключение, если вы пытаетесь создать недопустимый фильтр. служебная шина добавляет это исключение к сообщению, помещенному в очередь недоставленных сообщений, если при обработке фильтра для этого сообщения произошла ошибка. | Проверьте правильность фильтра. | Повторная попытка не помогает. |
| SessionCannotBeLockedException | Попытка принять сеанс с определенным идентификатором сеанса, но сеанс в данный момент заблокирован другим клиентом. | Убедитесь, что сеанс разблокирован другими клиентами. | Повторная попытка может помочь, если за это время сеанс был прерван. |
| Исключение о превышении размера транзакции | Слишком много операций является частью транзакции. | Уменьшите количество операций, входящих в эту транзакцию. | Повторная попытка не помогает. |
| MessagingEntityDisabledException | Запрос на операцию времени выполнения для отключенной сущности. | Активируйте сущность. | Повторная попытка может помочь, если сущность была активирована в промежуточный период. |
| NoMatchingSubscriptionException | служебная шина возвращает это исключение, если вы отправляете сообщение в раздел, в котором включена предварительная фильтрация, и ни один из фильтров не срабатывает. | Убедитесь, что хотя бы один фильтр совпадает. | Повторная попытка не помогает. |
| MessageSizeExceededException | Полезная нагрузка сообщения превышает ограничение в 256 КБ. Ограничение в 256 КБ — это общий размер сообщения, который может включать системные свойства и любые накладные расходы .NET. | Уменьшите размер полезной нагрузки сообщения, затем повторите операцию. | Повторная попытка не помогает. |
| Транзакционное исключение | Контекстная транзакция (Transaction.Current) недопустима. Она могла быть завершена или прервана. Внутреннее исключение может предоставить дополнительную информацию. |
Повторная попытка не помогает. | |
| TransactionInDoubtException | В отношении транзакции, которая вызывает сомнения, предпринимается попытка совершить операцию, или предпринимается попытка зафиксировать транзакцию, и транзакция становится под сомнением. | Приложение должно обрабатывать это исключение (в качестве особого случая), так как транзакция может уже быть зафиксирована. | - |
QuotaExceededException
QuotaExceededException указывает на превышение квоты для конкретного объекта.
Замечание
Сведения о квотах служебная шина см. в разделе Квоты.
Очереди и темы
В случае с очередями и разделами обычно дело в размере очереди. Свойство сообщения об ошибке содержит дополнительные сведения, как показано в следующем примере:
Microsoft.ServiceBus.Messaging.QuotaExceededException
Message: The maximum entity size has been reached or exceeded for Topic: 'xxx-xxx-xxx'.
Size of entity in bytes:1073742326, Max entity size in bytes:
1073741824..TrackingId:xxxxxxxxxxxxxxxxxxxxxxxxxx, TimeStamp:3/15/2013 7:50:18 AM
Сообщение уведомляет о том, что для раздела превышено ограничение размера, в данном случае 1 ГБ (ограничение по умолчанию).
Пространства имен
Для пространств имен QuotaExceededException может указывать на то, что приложение превысило максимальное количество подключений к пространству имен. Рассмотрим пример.
Microsoft.ServiceBus.Messaging.QuotaExceededException: ConnectionsQuotaExceeded for namespace xxx.
<tracking-id-guid>_G12 --->
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]:
ConnectionsQuotaExceeded for namespace xxx.
Распространенные причины
Существует две распространенные причины этой ошибки: очередь недоставленных писем и нефункционирование получателей сообщений.
Очередь недоставленных сообщений Читателю не удается завершить обработку сообщений, и сообщения возвращаются в очередь или тему по истечении времени блокировки. Это может произойти, если читатель сталкивается с исключением, которое не позволяет ему вызвать BrokeredMessage.Complete. После 10 попыток считывания сообщения оно по умолчанию перемещается в очередь недоставленных сообщений. Это поведение управляется свойством QueueDescription.MaxDeliveryCount и имеет значение по умолчанию 10. По мере накапливания сообщений в очереди недоставленных сообщений они начинают занимать много места.
Чтобы устранить эту проблему, считайте и завершите сообщения в очереди недоставленных сообщений, как и в любой другой очереди. Вы можете использовать метод FormatDeadLetterPath, чтобы помочь сформировать путь к очереди недоставленных сообщений.
Получатель остановлен. Получатель прекратил прием сообщений из очереди или подписки. Чтобы определить это, нужно посмотреть на свойство QueueDescription.MessageCountDetails , которое показывает полную разбивку сообщений. Если свойство ActiveMessageCount имеет большое значение или увеличивается, то сообщения читаются не так быстро, как записываются.
TimeoutException
TimeoutException указывает, что операция, инициированная пользователем, занимает больше времени, чем время ожидания операции.
Следует проверить значение свойства ServicePointManager.DefaultConnectionLimit, так как достижение этого ограничения также может породить исключение TimeoutException.
Следует ожидать тайм-аутов во время операций обслуживания или в промежутках между ними, таких как обновления службы служебная шина (или) обновления ОС на ресурсах, на которых выполняется служба. Во время обновлений ОС объекты перемещаются, а узлы обновляются или перезагружаются, в результате чего могут возникать тайм-ауты. Подробные сведения о Соглашении об уровне обслуживания (SLA) для службы служебной шины Azure см. в статье Соглашение об уровне обслуживания для служебной шины.
Очереди и темы
Для очередей и тем время ожидания указывается либо в свойстве MessagingFactorySettings.OperationTimeout, в строке подключения, либо с помощью ServiceBusConnectionStringBuilder. Само сообщение об ошибке может отличаться, но оно всегда содержит значение времени ожидания, указанное для текущей операции.
MessageLockLostException
Исключение MessageLockLostException указывает на то, что срок действия блокировки сообщения, удерживаемой клиентом, истек на стороне службы.
Причина
Исключение MessageLockLostException возникает, когда сообщение получено в режиме получения PeekLock, а срок действия блокировки, удерживаемой клиентом, истек на стороне службы.
Срок действия блокировки сообщения может истекать из-за различных причин:
- Срок действия таймера блокировки истек до продления клиентским приложением.
- Клиентское приложение получило блокировку, сохранило ее в постоянном хранилище, а затем перезапустило. После перезапуска клиентское приложение просматривало бортовые сообщения и пыталось их завершить.
Это исключение также может появиться в следующих сценариях:
- Обновление службы
- Обновление ОС
- Изменение свойств сущности (очереди, темы, подписки) при удержании блокировки.
Резолюция
Когда клиентское приложение получает MessageLockLostException, оно больше не может обрабатывать сообщение. Клиентское приложение может дополнительно рассмотреть возможность ведения журнала исключения для анализа, но клиент должен удалить сообщение.
Так как срок действия блокировки сообщения истек, сообщение снова станет доступно в очереди (или подписке) и может быть обработано следующим клиентским приложением, которое вызывает метод receive.
Если значение MaxDeliveryCount превысигло, сообщение может быть перемещено в очередь недоставленных писем.
SessionLockLostException
SessionLockLostException указывает, что блокировка, удерживаемая клиентом на сеансе, истекла на стороне службы.
Причина
Исключение SessionLockLostException возникает, когда сеанс принят и срок действия блокировки, удерживаемой клиентом, истекает на стороне службы.
Срок действия блокировки сеанса может истекать из-за различных причин:
- Срок действия таймера блокировки истек до продления клиентским приложением.
- Клиентское приложение получило блокировку, сохранило ее в постоянном хранилище, а затем перезапустило. После перезапуска клиентское приложение просмотрело текущие сеансы и попыталось обработать в них сообщения.
Это исключение также может появиться в следующих сценариях:
- Обновление службы
- Обновление ОС
- Изменение свойств сущности (очереди, темы, подписки) при удержании блокировки.
Резолюция
Когда клиентское приложение получает SessionLockLostException, оно больше не может обрабатывать сообщения в сеансе. Клиентское приложение может рассмотреть возможность ведения журнала исключения для анализа, но клиент должен удалить сообщение.
Так как срок действия блокировки сеанса истек, он вернется к очереди (или подписке) и может быть заблокирован следующим клиентским приложением, которое принимает сеанс. Поскольку блокировка сеанса в любой момент времени удерживается только одним клиентским приложением, последовательная обработка гарантирована.
SocketException
SocketException указывает на проблему сетевого подключения между клиентом и службой служебная шина.
Причина
Исключение SocketException возникает в следующих случаях.
- Если попытка подключения завершается ошибкой, поскольку узел не ответил должным образом в течение указанного времени (код ошибки TCP 10060).
- Не удалось установить соединение, так как удаленный хост не ответил.
- Произошла ошибка при обработке сообщения или превышено время ожидания удаленным узлом.
- Проблема с сетевым ресурсом на базовом уровне.
Резолюция
Ошибки SocketException указывают на то, что виртуальная машина, на которой размещены приложения, не может преобразовать имя <mynamespace>.servicebus.windows.net в нужный IP-адрес.
Проверьте, выполнена ли следующая команда в сопоставлении с IP-адресом.
PS C:\> nslookup <mynamespace>.servicebus.windows.net
Что должно предоставить выходные данные, такие как:
Name: <cloudappinstance>.cloudapp.net
Address: XX.XX.XXX.240
Aliases: <mynamespace>.servicebus.windows.net
Если имя не разрешается в IP-адрес и псевдоним пространства имён, обратитесь к сетевому администратору для дальнейшего выяснения. Разрешение имён выполняется через DNS-сервер, который обычно является ресурсом в сети клиента. Если разрешение DNS выполняется с помощью Azure DNS, обратитесь в службу поддержки Azure.
Если разрешение имен работает должным образом, проверьте, разрешены ли подключения к Служебная шина Azure в руководстве по устранению неполадок с подключением.
MessagingException
MessagingException — это универсальное исключение для обмена сообщениями, которое может быть вызвано различными причинами.
Причина
MessagingException — это универсальное исключение, которое может быть вызвано по разным причинам. Вот некоторые из причин:
- Предпринята попытка создать QueueClient для Topic или Subscription.
- Размер отправляемого сообщения превышает ограничение для данного уровня. Узнайте больше о квотах и ограничениях служебная шина.
- Конкретный запрос к плоскости данных (отправка, получение, завершение, отмена) был прекращен из-за ограничения скорости.
- Временные проблемы, вызванные обновлениями и перезапусками служб.
Замечание
Список исключений не является исчерпывающим.
Резолюция
Действия по устранению зависят от того, что стало причиной возникновения MessagingException.
- При возникновении временных проблем (для параметра isTransient задано значение true) или при проблемах с регулированием повторная попытка операции может решить проблему. Можно использовать политику повторных попыток по умолчанию в SDK.
- Для других проблем сведения в исключении указывают на проблему, и из них можно вывести шаги по ее решению.
StorageQuotaExceededException
Объект StorageQuotaExceededException указывает, что общий размер сущностей в пространстве имен класса Premium превысил предел хранения.
Причина
Исключение StorageQuotaExceededException создается, когда общий размер сущностей в пространстве имен уровня "Премиум" превышает ограничение в 1 ТБ на единицу обмена сообщениями.
Резолюция
- Увеличение количества единиц обмена сообщениями, назначенных пространству имен уровня "Премиум"
- Если вы уже используете максимально допустимые единицы обмена сообщениями для пространства имен, создайте отдельное пространство имен.
Дальнейшие шаги
Полные справочные материалы по API служебной шины для .NET доступны в справочнике по API Azure для .NET. Советы по устранению неполадок см. в руководстве по устранению неполадок.