Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе содержатся распространенные вопросы и справка по устранению неполадок для использования очередей в 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: Наиболее распространенной причиной является разрешение.
Убедитесь, что
NetMsmqActivatorпроцесс выполняется, а удостоверениеNetMsmqActivatorпроцесса предоставляется для чтения и получения разрешения на очередь.Если
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: Нельзя использовать локальное хранилище сертификатов компьютера с режимом сертификата. Необходимо скопировать сертификат из хранилища сертификатов компьютера в текущее хранилище пользователей с помощью оснастки сертификата. Чтобы получить оснастку сертификата, выполните следующие действия.
Нажмите кнопку "Пуск", выберите "Запустить", введите
mmcи нажмите кнопку "ОК".В консоли управления Майкрософт откройте меню "Файл " и выберите пункт "Добавить или удалить оснастку".
В диалоговом окне "Добавление и удаление оснастки" нажмите кнопку "Добавить ".
В диалоговом окне "Добавить автономную оснастку" выберите "Сертификаты" и нажмите "Добавить".
В диалоговом окне " Сертификаты" выберите "Моя учетная запись пользователя " и нажмите кнопку "Готово".
Затем добавьте вторую оснастку "Сертификаты" с помощью предыдущих шагов, но на этот раз выберите учетную запись компьютера и нажмите кнопку "Далее".
Выберите локальный компьютер и нажмите кнопку "Готово". Теперь вы можете перетаскивать сертификаты из хранилища сертификатов компьютера в текущее хранилище пользователей.
Вопрос. Когда служба считывает очередь на другом компьютере в режиме рабочей группы, я получаю исключение "отказано в доступе".
A: В режиме рабочей группы для удаленного приложения для получения доступа к очереди приложение должно иметь разрешение на доступ к очереди. Добавьте "Анонимный вход" в список управления доступом очереди (ACL) и предоставьте ему права чтения.
Вопрос. Если клиент сетевой службы (или любой клиент, у которых нет учетной записи домена), отправляет сообщение в очереди, отправка завершается ошибкой с недопустимым сертификатом. Как исправить это?
A: Проверьте конфигурацию привязки. Привязка по умолчанию включает безопасность транспорта MSMQ для подписывания сообщения. Выключите.
Удаленное получение транзакций
Вопрос. Если у меня есть очередь на компьютере A и служба WCF, которая считывает сообщения из очереди на компьютере B (сценарий удаленного приема транзакций), сообщения не считываются из очереди. Сведения о трассировке указывают на сбой получения сообщения "Транзакция не может быть импортирована". Что можно сделать, чтобы исправить это?
A: Ниже приведены три возможные причины.
Если вы работаете в режиме домена, для удаленного транзакционного получения требуется сетевой доступ к службу Microsoft Distributed Transaction Coordinator (MSDTC). Это можно включить с помощью добавления и удаления компонентов.
Проверьте режим проверки подлинности для взаимодействия с диспетчером транзакций. Если вы находитесь в режиме рабочей группы, необходимо выбрать параметр "Без обязательной проверки подлинности". Если вы находитесь в режиме домена, необходимо выбрать значение "Требуется взаимная проверка подлинности".
Убедитесь, что MSDTC находится в списке исключений в параметрах брандмауэра подключения к Интернету .
Убедитесь, что вы используете Windows Vista. MSMQ в Windows Vista поддерживает удаленное чтение транзакций. MSMQ в предыдущих выпусках Windows не поддерживает удаленное чтение транзакций.
Вопрос. Когда служба, считываемая из очереди, является сетевой службой, например, на веб-узле, почему при чтении из очереди возникает исключение, отказано в доступе?
A: Доступ на чтение для сетевой службы должен быть добавлен в ACL очереди, чтобы обеспечить возможность чтения сетевой службой из очереди.
Вопрос. Можно ли использовать службу активации MSMQ для активации приложений на основе сообщений в очереди на удаленном компьютере?
Ответ. Да. Для этого необходимо настроить службу активации MSMQ для запуска в качестве сетевой службы и добавить доступ к сети к очереди на удаленном компьютере.
Использование пользовательских привязок MSMQ с включенной функцией ReceiveContext
При использовании настраиваемой привязки MSMQ с включенным ReceiveContext, обработка входящего сообщения использует поток из пула потоков, так как нативный MSMQ не поддерживает завершение ввода-вывода для асинхронного приема ReceiveContext. Это связано с тем, что обработка такого сообщения использует внутренние транзакции для ReceiveContext и MSMQ не поддерживает асинхронную обработку. Чтобы обойти эту проблему, можно добавить SynchronousReceiveBehavior в конечную точку для принудительной синхронной обработки или задать MaxPendingReceives равным 1.