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


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

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

30 сентября 2026 г. мы выведем из эксплуатации библиотеки SDK Azure Service Bus: WindowsAzure.ServiceBus, Microsoft.Azure.ServiceBus и com.microsoft.azure.servicebus, которые не соответствуют рекомендациям по Azure SDK. Мы также завершим поддержку протокола 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 (Исключение OperationCanceledException) Предпринята попытка вызвать операцию с объектом, который уже закрыт, прерван или удален. Иногда это означает, что внешняя транзакция уже удалена. Проверьте код и убедитесь, что он не вызывает операции с использованием удаленного объекта. Повторная попытка не помогает.
Исключение UnauthorizedAccessException Объекту TokenProvider не удалось получить маркер, маркер недействителен или маркер не содержит утверждений, необходимых для выполнения операции. Убедитесь, что поставщик токенов создан с правильными значениями. Проверьте конфигурацию Службы контроля доступа. Повторная попытка может помочь в некоторых случаях. Добавьте в код логику повторных попыток.
ArgumentException (АргументИсключение)
ArgumentNullException
ArgumentOutOfRangeException
Для этого метода предоставлен один или несколько недопустимых аргументов.
URI, предоставленный NamespaceManager или Create , содержит сегменты пути.
В NamespaceManager или Create передана недопустимая схема универсального кода ресурса (URI).
Значение свойства превышает 32 КБ.
Проверьте вызывающий код и убедитесь, что аргументы заданы правильно. Повторная попытка не помогает.
MessagingEntityNotFoundException Сущность, связанная с операцией, не существует или была удалена. Убедитесь, что сущность существует. Повторная попытка не помогает.
MessageNotFoundException (СообщениеНеНайденноеИсключение) Попытка получить сообщение с определенным порядковым номером. Это сообщение не найдено. Убедитесь, что сообщение еще не получено. Проверьте очередь недоставленных сообщений, чтобы узнать, было ли сообщение отправлено как недоставленное. Повторная попытка не помогает.
Исключение MessagingCommunication Клиенту не удается установить подключение к служебной шине. Убедитесь, что имя хоста указано правильно и хост доступен.

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

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

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

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

Сервер или сервис столкнулись с ошибкой во время обработки запроса. Подробные сведения см. в сообщении об исключении. Обычно это временное исключение.

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

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

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

Проверьте свойство IsTransient . Если это так, вы можете повторить операцию.

Если исключение связано с регулированием, подождите несколько секунд и повторите операцию. Поведение повтора не определено и может не помочь в других сценариях.
Исключение MessagingEntityAlreadyExistsException Попытайтесь создать сущность с именем, которое уже используется другой сущностью в этом пространстве имен службы. Удалите существующую сущность или выберите другое имя для создаваемой сущности. Повторная попытка не помогает.
QuotaExceededException Сущность обмена сообщениями достигла максимально допустимого размера или было превышено максимальное количество подключений к пространству имен. Создайте в сущности пространство, получая сообщения из сущности или ее подочередей. Ознакомьтесь с разделом Исключение QuotaExceededException. Повторная попытка может помочь, если сообщения были удалены.
ПравилоДействиеИсключение Служебная шина возвращает это исключение, если вы пытаетесь создать недопустимое действие правила. Служебная шина прикрепляет это исключение к недоставленному сообщению, если при обработке действия правила для этого сообщения возникает ошибка. Проверьте правильность действия правила. Повторная попытка не помогает.
FilterException (Исключение фильтра) Служебная шина возвращает это исключение, если вы пытаетесь создать недопустимый фильтр. Служебная шина прикрепляет это исключение к недоставленному сообщению, если при обработке фильтра для этого сообщения произошла ошибка. Проверьте правильность фильтра. Повторная попытка не помогает.
Исключение SessionCannotBeLockedException Попытка принять сеанс с определенным идентификатором сеанса, но сеанс в данный момент заблокирован другим клиентом. Убедитесь, что сеанс разблокирован другими клиентами. Повторная попытка может помочь, если сеанс был завершен в промежуточный период.
ИсключениеTransactionSizeExceededException Слишком много операций является частью транзакции. Уменьшите количество операций, входящих в эту транзакцию. Повторная попытка не помогает.
Исключение 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.

Распространенные причины

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

  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 превысигло, сообщение может быть перемещено в очередь недоставленных писем.

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 .

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

StorageQuotaExceededException

Причина

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

Резолюция

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

Дальнейшие шаги

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