Устранение неполадок очереди сообщений

В этом разделе содержатся распространенные вопросы и справка по устранению неполадок для использования очередей в Windows Communication Foundation (WCF).

Часто задаваемые вопросы

Вопрос: Я использовал WCF Beta 1, и я установил хотфикс MSMQ. Нужно ли удалить хотфикc?

Ответ. Да. Это исправление больше не поддерживается. WCF теперь работает с MSMQ без необходимости обновления.

Вопрос. Существует две привязки для MSMQ: NetMsmqBinding и MsmqIntegrationBinding. Что следует использовать и когда?

A: Используйте NetMsmqBinding, когда вы хотите использовать MSMQ в качестве транспорта для организации очередей обмена данными между двумя приложениями WCF. Используйте MsmqIntegrationBinding, когда вы хотите использовать существующие приложения MSMQ для взаимодействия с новыми приложениями WCF.

Вопрос: Нужно ли обновить MSMQ для использования привязок NetMsmqBinding и MsmqIntegration?

Ответ. Нет. Обе привязки работают с MSMQ 3.0 в Windows XP и Windows Server 2003. Некоторые функции привязок становятся доступными при обновлении до MSMQ 4.0 в Windows Vista.

Вопрос. Какие функции NetMsmqBinding и MsmqIntegrationBinding привязки доступны в MSMQ 4.0, но не в MSMQ 3.0?

A: Следующие функции доступны в MSMQ 4.0, но не в MSMQ 3.0:

  • Настраиваемая очередь недоставленных писем поддерживается только в MSMQ 4.0.

  • MSMQ 3.0 и 4.0 обрабатывают подозрительные сообщения по-разному.

  • Только MSMQ 4.0 поддерживает удаленное чтение транзакций.

Вопрос. Можно ли использовать MSMQ 3.0 на одной стороне связи с очередью и MSMQ 4.0 на другой стороне?

Ответ. Да.

Вопрос. Я хочу интегрировать существующие приложения MSMQ с новыми клиентами или серверами WCF. Нужно ли обновить обе стороны инфраструктуры MSMQ?

Ответ. Нет. Обновление до MSMQ 4.0 на любой из сторон не требуется.

Устранение неполадок

В этом разделе содержатся ответы на наиболее распространенные проблемы, связанные с устранением неполадок. Некоторые проблемы, которые являются известными ограничениями, также описаны в заметках о выпуске.

Вопрос. Я пытаюсь использовать частную очередь, и я получаю следующее исключение: System.InvalidOperationExceptionURL-адрес недопустим. URL-адрес очереди не может содержать символ $. Используйте синтаксис net.msmq://machine/private/queueName, чтобы указать на частную очередь.

A: Проверьте в вашей конфигурации и коде универсальный идентификатор ресурса (URI) для очереди. Не используйте символ "$" в URI. Например, чтобы адресовать частную очередь с именем OrdersQueue, укажите URI как net.msmq://localhost/private/ordersQueue.

Вопрос. Вызов ServiceHost.Open() приложения в очереди вызывает следующее исключение: System.ArgumentExceptionбазовый адрес не может содержать строку запроса URI. Why?

A: Проверьте URI очереди в файле конфигурации и в коде. Хотя очереди MSMQ поддерживают использование символа "?", URI интерпретируют этот символ как начало строкового запроса. Чтобы избежать этой проблемы, используйте имена очередей, которые не содержат символов ?.

Вопрос: Мое сообщение отправлено успешно, но на приемнике не вызывается операция службы. Why?

A: Чтобы определить ответ, выполните указанный ниже контрольный список:

  • Убедитесь, что требования к очереди транзакций совместимы с указанными гарантиями. Обратите внимание на следующие принципы:

    • Вы можете отправлять устойчивые сообщения (датаграммы и сеансы) с гарантией "точно один раз" (ExactlyOnce = true) только в транзакционную очередь.

    • Сеансы можно отправлять только с гарантией "ровно один раз".

    • Транзакция требуется для получения сообщений в сеансе из очереди транзакций.

    • Вы можете отправлять или получать волатильные или долговечные сообщения (только дейтаграммы) без гарантий (ExactlyOnce = false) только на нетранзакционную очередь.

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

  • Проверьте исходящие очереди для подключения или устранения проблем.

Вопрос. Я указал настраиваемую очередь недоставленных писем, но при запуске приложения отправителя я получаю исключение, что очередь недоставленных писем не найдена, или приложение отправки не имеет разрешения на очередь недоставленных писем. Почему это происходит?

A: URI очереди недоставленных сообщений должен содержать имя "localhost" или имя компьютера в первом сегменте, например net.msmq://localhost/private/myAppdead-letter queue.

Вопрос. Всегда ли необходимо определить настраиваемую очередь недоставленных писем или очередь недоставленных писем по умолчанию?

A: Если гарантии имеют значение "ровно один раз" (ExactlyOnce = true), и если вы не указываете настраиваемую очередь недоставленных сообщений, по умолчанию используется очередь недоставленных сообщений в пределах системы.

Если гарантии отсутствуют (ExactlyOnce = false), то значением по умолчанию является отсутствие функциональности очереди недоставленных писем.

Вопрос: Моя служба вызывает исключение при вызове SvcHost.Open с сообщением "Требования EndpointListener не могут быть выполнены фабрикой слушателей". Why?

А. Проверьте контракт службы. Возможно, вы забыли указать "IsOneWay=true" в параметрах всех операций службы. Очереди поддерживают только односторонние операции обслуживания.

Вопрос: В очереди есть сообщения, но не вызывается операция службы. В чем проблема?

A: Определите, находится ли узел службы в состоянии ошибки. Вы можете проверить это, просмотрев трассировку или реализовав IErrorHandler. Хост службы по умолчанию выходит из строя, если обнаружено ядовитое сообщение.

Вопрос. В очереди есть сообщения, но моя служба, размещенная в интернете, не активируется. Why?

A: Наиболее распространенной причиной является разрешение.

  1. Убедитесь, что NetMsmqActivator процесс выполняется, а удостоверение NetMsmqActivator процесса предоставляется для чтения и получения разрешения на очередь.

  2. Если NetMsmqActivator мониторит очереди на удаленном компьютере, убедитесь, что NetMsmqActivator не запускается с ограниченным токеном. Чтобы запустить NetMsmqActivator с неограниченным токеном, выполните указанные ниже действия.

    sc sidtype NetMsmqActivator unrestricted
    

Для вопросов, не связанных с безопасностью веб-хостинга, см. Веб-хостинг в очереди приложения.

Вопрос: Какой самый простой способ доступа к сеансам?

A: Задайте autoComplete=true в операции, которая соответствует последнему сообщению в сеансе, и задайте autoComplete=false для всех оставшихся операций службы.

Вопрос: Почему моя служба выбрасывает ProtocolException, когда читает из очереди, содержащей как сообщения сеанса, так и сообщения датаграммы?

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

System.ServiceModel.MsmqPoisonMessageException: The transport channel detected a poison message. This occurred because the message exceeded the maximum number of delivery attempts or because the channel detected a fundamental problem with the message. The inner exception may contain additional information.
---> System.ServiceModel.ProtocolException: An incoming MSMQ message contained invalid or unexpected .NET Message Framing information in its body. The message cannot be received. Ensure that the sender is using a compatible service contract with a matching SessionMode.

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

Интеграция MSMQ: конкретные способы устранения неполадок

Вопрос. При отправке сообщения или при открытии узла службы возникает ошибка, указывающая, что схема неправильная. Why?

A: При использовании привязки интеграции MSMQ необходимо использовать схему msmq.formatname. Например, msmq.formatname:DIRECT=OS:.\private$\OrdersQueue. Но при указании настраиваемой очереди недоставленных писем необходимо использовать схему net.msmq.

Вопрос. При использовании имени общедоступного или закрытого формата и открытии узла службы в Windows Vista возникает ошибка. Why?

A: Канал интеграции WCF в Windows Vista проверяет, можно ли открыть подочередь для основной очереди приложения для обработки отравленных сообщений. Имя вложенного запроса является производным от URI msmq.formatname, переданного прослушивателю. Имя подочереди в MSMQ может быть только прямым именем формата. Таким образом, вы видите ошибку. Измените URI очереди на название формата Direct.

Вопрос. При получении сообщения из приложения MSMQ сообщение находится в очереди и не считывается принимающим приложением WCF. Why?

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

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

A: По умолчанию сообщения подписываются с помощью внутреннего сертификата MSMQ, требующего службы каталогов Active Directory. В режиме рабочей группы, так как Active Directory недоступен, подписывание сообщения завершается ошибкой. Поэтому сообщение попадает в очередь недоставленных писем и причину сбоя, например "Плохая подпись", указывается.

Обходной путь — отключить безопасность. Это делается с помощью настройки Mode = None для работы в режиме рабочей группы.

Еще одним решением является получение MsmqTransportSecurity из свойства Transport, его установка в Certificate, а также настройка клиентского сертификата.

Еще одним решением является установка MSMQ с интеграцией Active Directory.

Вопрос. Когда я отправляю сообщение с привязкой по умолчанию (включена безопасность транспорта) в Active Directory в очередь, я получаю сообщение "Внутренний сертификат не найден". Как исправить это?

A: Это означает, что сертификат в Active Directory для отправителя должен быть продлен. Для этого откройте панель управления, администрирование, управление компьютерами, щелкните правой кнопкой мыши MSMQ и выберите "Свойства". Перейдите на вкладку "Сертификат пользователя " и нажмите кнопку "Продлить ".

Вопрос. Когда я отправляю сообщение с помощью Certificate и указываю используемый сертификат, я получаю сообщение "Недопустимый сертификат". Как исправить это?

A: Нельзя использовать локальное хранилище сертификатов компьютера с режимом сертификата. Необходимо скопировать сертификат из хранилища сертификатов компьютера в текущее хранилище пользователей с помощью оснастки сертификата. Чтобы получить оснастку сертификата, выполните следующие действия.

  1. Нажмите кнопку "Пуск", выберите "Запустить", введите mmcи нажмите кнопку "ОК".

  2. В консоли управления Майкрософт откройте меню "Файл " и выберите пункт "Добавить или удалить оснастку".

  3. В диалоговом окне "Добавление и удаление оснастки" нажмите кнопку "Добавить ".

  4. В диалоговом окне "Добавить автономную оснастку" выберите "Сертификаты" и нажмите "Добавить".

  5. В диалоговом окне " Сертификаты" выберите "Моя учетная запись пользователя " и нажмите кнопку "Готово".

  6. Затем добавьте вторую оснастку "Сертификаты" с помощью предыдущих шагов, но на этот раз выберите учетную запись компьютера и нажмите кнопку "Далее".

  7. Выберите локальный компьютер и нажмите кнопку "Готово". Теперь вы можете перетаскивать сертификаты из хранилища сертификатов компьютера в текущее хранилище пользователей.

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

A: В режиме рабочей группы для удаленного приложения для получения доступа к очереди приложение должно иметь разрешение на доступ к очереди. Добавьте "Анонимный вход" в список управления доступом очереди (ACL) и предоставьте ему права чтения.

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

A: Проверьте конфигурацию привязки. Привязка по умолчанию включает безопасность транспорта MSMQ для подписывания сообщения. Выключите.

Удаленное получение транзакций

Вопрос. Если у меня есть очередь на компьютере A и служба WCF, которая считывает сообщения из очереди на компьютере B (сценарий удаленного приема транзакций), сообщения не считываются из очереди. Сведения о трассировке указывают на сбой получения сообщения "Транзакция не может быть импортирована". Что можно сделать, чтобы исправить это?

A: Ниже приведены три возможные причины.

  • Если вы работаете в режиме домена, для удаленного транзакционного получения требуется сетевой доступ к службу Microsoft Distributed Transaction Coordinator (MSDTC). Это можно включить с помощью добавления и удаления компонентов.

    Снимок экрана: включение доступа к сети DTC.

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

    Включение транзакций XA

  • Убедитесь, что MSDTC находится в списке исключений в параметрах брандмауэра подключения к Интернету .

  • Убедитесь, что вы используете Windows Vista. MSMQ в Windows Vista поддерживает удаленное чтение транзакций. MSMQ в предыдущих выпусках Windows не поддерживает удаленное чтение транзакций.

Вопрос. Когда служба, считываемая из очереди, является сетевой службой, например, на веб-узле, почему при чтении из очереди возникает исключение, отказано в доступе?

A: Доступ на чтение для сетевой службы должен быть добавлен в ACL очереди, чтобы обеспечить возможность чтения сетевой службой из очереди.

Вопрос. Можно ли использовать службу активации MSMQ для активации приложений на основе сообщений в очереди на удаленном компьютере?

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

Использование пользовательских привязок MSMQ с включенной функцией ReceiveContext

При использовании настраиваемой привязки MSMQ с включенным ReceiveContext, обработка входящего сообщения использует поток из пула потоков, так как нативный MSMQ не поддерживает завершение ввода-вывода для асинхронного приема ReceiveContext. Это связано с тем, что обработка такого сообщения использует внутренние транзакции для ReceiveContext и MSMQ не поддерживает асинхронную обработку. Чтобы обойти эту проблему, можно добавить SynchronousReceiveBehavior в конечную точку для принудительной синхронной обработки или задать MaxPendingReceives равным 1.