Поделиться через


служебная шина исключения обмена сообщениями (не рекомендуется)

В этой статье перечислены исключения для .NET, созданные с использованием API .NET Framework.

30 сентября 2026 г. мы удалим библиотеки пакета SDK Служебная шина Azure WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus и com.microsoft.azure.servicebus, которые не соответствуют рекомендациям по пакету SDK Azure. Мы также завершим поддержку протокола SBMP, поэтому вы больше не сможете использовать этот протокол после 30 сентября 2026 года. Перейдите в последние библиотеки пакета SDK Azure, которые предлагают критически важные обновления системы безопасности и улучшенные возможности до этой даты.

Хотя старые библиотеки по-прежнему могут использоваться после 30 сентября 2026 года, они больше не будут получать официальную поддержку и обновления от Майкрософт. Дополнительные сведения см. в объявлении о выходе на пенсию в службу поддержки.

Категории исключений

API обмена сообщениями создают исключения, которые можно разделить на следующие категории с указанием связанного действия, предпринимаемого для их устранения. Значение и причины исключения могут различаться в зависимости от типа сущности обмена сообщениями.

  1. Ошибка в коде пользователя (System.ArgumentException, System.InvalidOperationException, System.OperationCanceledException, System.Runtime.Serialization.SerializationException). Общее действие: прежде чем продолжить, попытайтесь исправить код.
  2. Ошибка настройки или конфигурации (Microsoft.ServiceBus.Messaging.MessagingEntityNotFoundException, System.UnauthorizedAccessException). Общее действие: проверьте конфигурацию и измените ее при необходимости.
  3. Временные исключения (Microsoft.ServiceBus.Messaging.MessagingException, Microsoft.ServiceBus.Messaging.ServerBusyException, Microsoft.ServiceBus.Messaging.MessagingCommunicationException). Общее действие: повторите операцию или уведомите пользователей. Класс RetryPolicy в клиентском пакете SDK можно настроить для автоматической обработки повторных попыток. Дополнительные сведения см. в руководстве по обработке повторных попыток.
  4. Другие исключения (System.Transactions.TransactionException, System.TimeoutException, Microsoft.ServiceBus.Messaging.MessageLockLostException, Microsoft.ServiceBus.Messaging.SessionLockLostException). Общее действие: связано с типом исключения; см. таблицу в следующем разделе.

Важно!

Типы исключений

В следующей таблице перечислены типы исключений обмена сообщениями и их причины, а также рекомендуемые действия, которые можно выполнять.

Тип исключения Описание, причина, примеры Рекомендуемое действие Примечание к автоматическому или немедленному повтору
TimeoutException Сервер не ответил на запрошенную операцию в течение указанного времени, контролируемого параметром OperationTimeout. Возможно, сервер выполнил запрошенную операцию. Это исключение может произойти вследствие сетевых или других задержек в инфраструктуре. Проверьте состояние системы для обеспечения согласованности и при необходимости повторите попытку. Ознакомьтесь с разделом Исключения времени ожидания. Повторная попытка может помочь в некоторых случаях. Добавьте в код логику повторных попыток.
InvalidOperationException Запрошенная пользователем операция не разрешается для выполнения в пределах сервера или службы. Подробные сведения см. в сообщении об исключении. Например, операция Complete() создаст это исключение, если сообщение было получено в режиме ReceiveAndDelete. Проверьте код и обратитесь к документации. Убедитесь, что запрошенная операция допустима. Повторная попытка не помогает.
OperationCanceledException Предпринята попытка вызвать операцию с объектом, который уже закрыт, прерван или удален. Иногда это означает, что внешняя транзакция уже удалена. Проверьте код и убедитесь, что он не вызывает операции с использованием удаленного объекта. Повторная попытка не помогает.
UnauthorizedAccessException Объекту TokenProvider не удалось получить токен, токен является недопустимым или не содержит утверждений, необходимых для выполнения этой операции. Убедитесь, что поставщик маркеров создан с использованием правильных значений. Проверьте конфигурацию службы контроля доступа. Повторная попытка может помочь в некоторых случаях. Добавьте в код логику повторных попыток.
ArgumentException
ArgumentNullException
ArgumentOutOfRangeException
Для этого метода предоставлен один или несколько недопустимых аргументов.
URI, предоставленный в NamespaceManager или Create , содержит сегменты пути.
В NamespaceManager или Create передана недопустимая схема универсального кода ресурса (URI).
Значение свойства превышает 32 КБ.
Проверьте вызывающий код и убедитесь, что аргументы заданы правильно. Повторная попытка не помогает.
MessagingEntityNotFoundException Сущность, связанная с операцией, не существует или была удалена. Убедитесь, что сущность существует. Повторная попытка не помогает.
MessageNotFoundException Предпринята попытка получить сообщение с определенным порядковым номером. Это сообщение не найдено. Убедитесь, что сообщение уже не было получено. Проверьте очередь недоставленных сообщений, чтобы увидеть, не находится ли в ней сообщение. Повторная попытка не помогает.
MessagingCommunicationException Клиент не сможет установить соединение со служебной шиной. Убедитесь, что имя узла указано правильно и узел доступен.

Если код выполняется в среде с брандмауэром или прокси-сервером, убедитесь, что трафик к домену/IP-адресу или порту служебной шины не заблокирован.

Повторная попытка может помочь при наличии периодических сбоев подключения.
ServerBusyException Служба не может обработать запрос. Клиент может некоторое время подождать, после чего следует повторить операцию. Клиент может повторить попытку после определенного интервала. Если в результате повтора возникает другое исключение, проверьте поведение повтора этого исключения.
MessagingException Исключение универсального обмена сообщениями, которое может быть вызвано в следующих случаях:

Предпринята попытка создать QueueClient с использованием имени или пути, которые относятся к другому типу сущности (например, разделу).

Предпринята попытка отправить сообщение размером свыше 256 КБ.

Во время обработки запроса возникла ошибка сервера или службы. Подробные сведения см. в сообщении об исключении. Как правило, это временное исключение.

Запрос был прекращен, так как выполняется регулирование сущности. Код ошибки: 50001, 50002, 50008.

Проверьте код и убедитесь, что для текста сообщения применяются только сериализуемые объекты (или используйте настраиваемый сериализатор).

Обратитесь к документации для получения сведений о поддерживаемых типах значений свойств и используйте только поддерживаемые типы.

Проверьте свойство IsTransient . Если оно имеет значение true, можно повторить операцию.

Если исключение вызвано регулированием, подождите несколько секунд и повторите операцию. Алгоритм повторной попытки не определен и может не помочь в других сценариях.
MessagingEntityAlreadyExistsException Предпринята попытка создать сущность с именем, которое уже используется другой сущностью в этом пространстве имен службы. Удалите существующую сущность или выберите другое имя для сущности, которую нужно создать. Повторная попытка не помогает.
QuotaExceededException Сущность обмена сообщениями достигла максимально допустимого размера, или превышено максимально возможное количество подключений к пространству имен. Создайте в сущности пространство, получая сообщения из сущности или ее подочередей. Ознакомьтесь с разделом Исключение QuotaExceededException. Повторная попытка может помочь, если сообщения были удалены.
RuleActionException Служебная шина возвращает это исключение, если вы пытаетесь создать недопустимое действие правила. Служебная шина вкладывает это исключение в недоставленное сообщение, если во время обработки действия правила для данного сообщения произошла ошибка. Проверьте правильность действия правила. Повторная попытка не помогает.
FilterException Служебная шина возвращает это исключение, если вы пытаетесь создать недопустимый фильтр. Служебная шина вкладывает это исключение в недоставленное сообщение, если во время обработки фильтра для данного сообщения произошла ошибка. Проверьте правильность фильтра. Повторная попытка не помогает.
SessionCannotBeLockedException Предпринята попытка принять сеанс с конкретным идентификатором сеанса, но сеанс в данный момент заблокирован другим клиентом. Убедитесь, что сеанс разблокирован другими клиентами. Повторная попытка может помочь, если сеанс был освобожден до этого времени.
TransactionSizeExceededException В состав транзакции входит слишком много операций. Сократите количество операций, входящих в состав этой транзакции. Повторная попытка не помогает.
MessagingEntityDisabledException Выполнен запрос на операцию среды выполнения с отключенной сущностью. Активируйте сущность. Повторная попытка может помочь, если сущность была активирована.
NoMatchingSubscriptionException служебная шина возвращает это исключение, если вы отправляете сообщение в раздел с включенным префиксом и ни один из фильтров не соответствует. Убедитесь, что соответствует по меньшей мере один фильтр. Повторная попытка не помогает.
MessageSizeExceededException Полезные данные сообщения превышают предел в 256 КБ. Предел в 256 КБ является общим размером сообщения с учетом системных свойств и служебных данных .NET. Сократите размер полезных данных сообщения, а затем повторите операцию. Повторная попытка не помогает.
TransactionException Недействительная транзакция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.

Основные причины

Существует две распространенные причины этой ошибки: очередь недоставленных писем и нефункционирование получателей сообщений.

  1. Очередь недоставленных сообщений. Средству чтения не удается завершить доставку сообщений, и сообщения возвращаются в очередь или раздел по истечении срока действия блокировки. Это может произойти, если в средстве чтения возникает исключение, блокирующее вызов BrokeredMessage.Complete. После 10 попыток считывания сообщения оно по умолчанию перемещается в очередь недоставленных сообщений. Это поведение управляется свойством QueueDescription.MaxDeliveryCount со значением по умолчанию "10". По мере накапливания сообщений в очереди недоставленных сообщений они начинают занимать много места.

    Чтобы устранить эту проблему, считайте и завершите сообщения в очереди недоставленных сообщений, как и в любой другой очереди. Вы можете использовать метод FormatDeadLetterPath, который помогает форматировать путь очереди недоставленных сообщений.

  2. Получатель остановлен. Получатель прекратил прием сообщений из очереди или подписки. Определить эту проблему можно с помощью свойства QueueDescription.MessageCountDetails, которое выводит полную статистику по сообщениям. Если свойство ActiveMessageCount является высоким или растет, сообщения не считываются так быстро, как они записываются.

TimeoutException

TimeoutException указывает, что запущенная пользователем операция занимает больше времени, чем время ожидания операции.

Следует проверить значение свойства ServicePointManager.DefaultConnectionLimit, так как достижение этого ограничения также может породить исключение TimeoutException.

Ожидается, что тайм-ауты будут происходить во время или между операциями обслуживания, например во время обновления служебной шины или ОС на ресурсах, которые используются службой. Во время обновлений ОС объекты перемещаются, а узлы обновляются или перезагружаются, в результате чего могут возникать тайм-ауты. Подробные сведения о Соглашении об уровне обслуживания (SLA) для службы служебной шины Azure см. в статье Соглашение об уровне обслуживания для служебной шины.

Очереди и разделы

Для очередей и разделов время ожидания указывается в свойстве MessagingFactorySettings.OperationTimeout (как часть строки подключения) или с помощью ServiceBusConnectionStringBuilder. Само сообщение об ошибке может отличаться, но оно всегда содержит значение времени ожидания, указанное для текущей операции.

MessageLockLostException

Причина

Исключение MessageLockLostException появляется при получении сообщения с помощью режима PeekLock, а срок блокировки клиентом истекает на стороне службы.

Срок действия блокировки сообщения может истекать из-за различных причин:

  • Срок действия таймера блокировки истек до продления клиентским приложением.
  • Клиентское приложение получило блокировку, сохранило ее в постоянном хранилище, а затем перезапустило. После перезапуска клиентское приложение просмотрело выполняемые сообщения и попыталось завершить их.

Это исключение также может появиться в следующих сценариях:

  • Обновление службы
  • Обновление ОС
  • Изменение свойств сущности (очереди, раздела, подписки) при удержании блокировки.

Разрешение

Когда клиентское приложение получает MessageLockLostException, оно больше не может обрабатывать сообщение. Клиентское приложение может дополнительно рассмотреть возможность ведения журнала исключения для анализа, но клиент должен удалить сообщение.

Так как срок действия блокировки сообщения истек, он вернется к очереди (или подписке) и может обрабатываться следующим клиентским приложением, которое вызывает получение.

Если превышено значение MaxDeliveryCount, сообщение может быть перемещено в DeadLetterQueue.

SessionLockLostException

Причина

Исключение SessionLockLostException появляется при принятии сеанса и истечении срока блокировки клиентом на стороне службы.

Срок действия блокировки сеанса может истекать из-за различных причин:

  • Срок действия таймера блокировки истек до продления клиентским приложением.
  • Клиентское приложение получило блокировку, сохранило ее в постоянном хранилище, а затем перезапустило. После перезапуска клиентское приложение просмотрело текущие сеансы и попыталось обработать в них сообщения.

Это исключение также может появиться в следующих сценариях:

  • Обновление службы
  • Обновление ОС
  • Изменение свойств сущности (очереди, раздела, подписки) при удержании блокировки.

Разрешение

Когда клиентское приложение получает SessionLockLostException, оно больше не может обрабатывать сообщения в сеансе. Клиентское приложение может рассмотреть возможность ведения журнала исключения для анализа, но клиент должен удалить сообщение.

Так как срок действия блокировки сеанса истек, он вернется к очереди (или подписке) и может быть заблокирован следующим клиентским приложением, которое принимает сеанс. Так как блокировка сеанса всегда удерживается только одним клиентским приложением, обработка в нужном порядке гарантированно произойдет.

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 — это универсальное исключение, которое может быть вызвано различными причинами. Ниже приведены некоторые причины.

  • Предпринята попытка создать QueueClient для раздела или подписки.
  • Размер отправляемого сообщения превышает ограничение для этого уровня. Узнайте больше о квотах и ограниченияхслужебной шины.
  • Запрос плоскости данных (отправка, получение, завершение, прекращение) был прерван из-за регулирования.
  • Временные проблемы, вызванные обновлением службы и перезагрузкой.

Примечание.

Приведенный выше список причин неполный.

Разрешение

Действия по разрешению проблемы зависят от того, что вызвало исключение MessagingException.

  • Для временных проблем (где задано значение true) или для проблем регулирования, повторная попытка операции может устранить ее. Для этого можно использовать политику повторных попыток по умолчанию в пакете SDK.
  • В случае других проблем ориентируйтесь на сведения в исключении, чтобы решить вопрос и найти выход из ситуации.

StorageQuotaExceededException

Причина

Исключение StorageQuotaExceededException создается, когда общий размер сущностей в пространстве имен уровня "Премиум" превышает ограничение в 1 ТБ на единицу обмена сообщениями.

Разрешение

  • Увеличьте количество единиц обмена сообщениями, назначенных пространству имен уровня "Премиум".
  • Если вы уже используете максимально допустимые единицы обмена сообщениями для пространства имен, создайте отдельное пространство имен.

Следующие шаги

Полные справочные материалы по API служебной шины для .NET доступны в справочнике по API Azure для .NET. Советы по устранению неполадок см. в руководстве по устранению неполадок.