Очереди в WCF
В данном разделе описывается применение взаимодействия с использованием очередей в Windows Communication Foundation (WCF).
Очереди в качестве привязки транспорта WCF
В WCF контракты определяют данные, участвующие обмене. Контракты представляют собой обмен сообщениями, связанными с бизнес-требованиями или конкретными приложениями. Механизм, с помощью которого осуществляется обмен сообщениями, задается в привязках. В WCF привязки инкапсулируют сведения об обмене сообщениями. Они предоставляют доступ к элементам конфигурации, с помощью которых пользователи могут управлять различными аспектами транспорта или протокола, которые представляются привязками. Очереди в WCF рассматриваются как и любые другие привязки транспорта, что является большим преимуществом для многих приложений, использующих очереди. В наше время многие приложения с использованием очередей разрабатываются не так, как другие распределенные приложения на базе удаленного вызова процедур, что затрудняет их понимание и обслуживание. В WCF стиль разработки распределенных приложений во многом одинаков, что упрощает их понимание и обслуживание. Более того, отделение механизма обмена данными от бизнес-логики упрощает настройку транспорта или внесение изменений в него, не затрагивая код, относящийся к предметной области. На следующем рисунке показана структура службы и клиента WCF, которые используют MSMQ в качестве транспорта.
Как видно из этого рисунка, клиент и служба должны определять только семантику приложения, т. е. контракт и реализацию. Служба настраивает поддерживающую очереди привязку с использованием нужных параметров. Клиент с помощью средства Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) создает клиент WCF для службы, а также файл конфигурации, описывающий привязки, которые должны использоваться для отправки сообщений службе. Таким образом, чтобы отправить сообщение с поддержкой очереди, клиент создает экземпляр клиента WCF и вызывает в нем операцию. В результате сообщение отправляется в очередь передачи, а затем передается в целевую очередь. Все сложные механизмы взаимодействия с использованием очередей оказываются скрытыми от приложения, которое отправляет и получает сообщения.
Поддерживающие очереди привязки в WCF имеют следующие недостатки:
все операции служб должны быть односторонними, поскольку в WCF поддерживающая очереди привязка по умолчанию не поддерживает дуплексное взаимодействие с использованием очередей. В образце двустороннего взаимодействия (Двусторонний обмен данными) показано, как с помощью двух односторонних контрактов реализовать двустороннее взаимодействие с использованием очередей;
для создания клиента WCF с использованием обмена метаданными требуется дополнительная конечная точка HTTP на стороне службы, чтобы к ней можно было напрямую обращаться с запросами для создания клиента WCF и получения сведений о привязки, необходимых для правильной настройки взаимодействия с использованием очередей;
в зависимости от поддерживающей очереди привязки требуется дополнительная настройка за пределами WCF. Например, класс NetMsmqBinding, входящий в состав WCF, требует настройки привязок, а также минимальной настройки MSMQ.
В следующих разделах описаны конкретные поддерживающие очереди привязки, входящие в состав WCF и основанные на MSMQ.
MSMQ
Основанный на очереди транспорт в WCF использует MSMQ для взаимодействия с использованием очередей.
MSMQ поставляется как дополнительный компонент Windows и выполняется как служба NT. MSMQ помещает передаваемые сообщения в очередь передачи и доставляет их в целевую очередь. Диспетчеры очередей MSMQ реализуют надежный протокол передачи сообщений, благодаря которому сообщения не могут быть потеряны при передаче. Этот протокол может быть собственным или основанным на SOAP, например как протокол SRMP.
В MSMQ, очереди могут быть транзакционными и нетранзакционными. Транзакционная очередь позволяет перехватывать и доставлять сообщение в транзакции, а затем продолжительное время хранить его в очереди. Сообщения, отправляемые в транзакционную очередь, передаются только один раз в заданном порядке. С помощью нетранзакционных очередей можно передавать, как неустойчивые, так и устойчивые сообщения. Сообщение, переданное в нетранзакционную очередь, не содержит каких-либо механизмов подтверждения надежной передачи, поэтому такое сообщение может быть потеряно.
Кроме того, очереди MSMQ можно защищать с помощью удостоверений Windows, зарегистрированных в службе каталогов Active Directory. При установке MSMQ можно установить интеграцию с Active Directory, для чего компьютер должен входить в домен Windows.
Дополнительные сведения MSMQ см. в разделе Message Queuing (MSMQ).
NetMsmqBinding
<netMsmqBinding> WCF — это поддерживающая очереди привязка WCF, которая обеспечивает две конечные точки для взаимодействия с помощью MSMQ. Поэтому привязка предоставляет свойства, имеющие отношение к MSMQ. Тем не менее в NetMsmqBinding доступны не все функции и свойства MSMQ. Компактная привязка NetMsmqBinding содержит оптимальный набор функций, которого должно быть достаточно для большинства пользователей.
В NetMsmqBinding в виде свойств привязок объявлены базовые принципы работы с очередями, рассмотренные выше. Эти свойства, в свою очередь, определяют, каким образом сообщения должны передаваться и отправляться с использованием MSMQ. Описание категорий свойств содержится в приведенных ниже разделах. Дополнительные сведения см. в разделе в основных разделах, посвященных конкретным свойствам.
Свойства ExactlyOnce и Durable
От значений свойств ExactlyOnce и Durable зависит то, каким образом сообщения передаются между очередями.
ExactlyOnce: если имеет значение true (по умолчанию), канал очереди следит за тем, чтобы сообщение доставлялось только один раз. Кроме того, он контролирует, чтобы сообщение не было потеряно. Если доставить сообщение не удается или срок жизни сообщения истекает до его доставки, это сообщение, а также причина сбоя при его доставке записываются в очередь недоставленных сообщений. Если свойство имеет значение false, канал очереди пытается передать сообщение. В этом случае можно (необязательно) выбрать очередь недоставленных сообщений.
Durable: если имеет значение true (по умолчанию), канал очереди проверяет, что MSMQ сохраняет сообщение на диск на продолжительное время. Таким образом, если службу MSMQ необходимо остановить и перезапустить, сообщения на диске передаются в целевую очередь или в службу. Если свойство имеет значение false, сообщения сохраняются во временном хранилище и теряются в случае остановки и перезапуска службы MSMQ.
Для реализации надежной передачи в режиме ExactlyOnce служба MSMQ требует, чтобы очередь была транзакционной. Кроме того, служба MSMQ требует чтения транзакции из транзакционной очереди. Поэтому при использовании привязки NetMsmqBinding следует помнить, что для отправки и получения сообщения требуется транзакция, если свойство ExactlyOnce имеет значение true. Аналогично служба MSMQ требует, чтобы очередь была нетранзакционной с гарантией наилучшего из возможного, как например в случаях, когда свойство ExactlyOnce равняется false или при обмене временными сообщениями. Таким образом, если свойство ExactlyOnce имеет значение false или свойство Durable имеет значение false, невозможно осуществлять отправку или получение с использованием транзакций.
![]() |
---|
Следите за тем, чтобы создавалась правильная очередь (транзакционная или нетранзакционная) в зависимости от параметров привязок. Если свойство ExactlyOnce имеет значение true, используется транзакционную очередь; в противном случае используется нетранзакционная очередь. |
Свойства очереди недоставленных сообщений
Очередь недоставленных сообщений служит для хранения сообщений, которые не удалось доставить. Пользователь может написать дополнительные операции по чтению сообщений из очереди недоставленных сообщений.
Многие системы организации очереди реализуют общесистемную очередь недоставленных сообщений. Служба MSMQ имеет две общесистемные очереди недоставленных сообщений: общесистемную очередь недоставленных нетранзакционных сообщений, которые не удалось доставить в нетранзакционные очереди, и общесистемную очередь недоставленных транзакционных сообщений, которые не удалось доставить в транзакционные очереди.
Если несколько клиентов отправляют сообщения в различные целевые очереди с использованием одной службы MSMQ, все отправляемые клиентами сообщения попадают в одну и ту же очередь недоставленных сообщений. Это не всегда желательно. Для лучшей изоляции WCF и MSMQ в Windows Vista предоставляют пользовательскую очередь недоставленных сообщений (или очередь недоставленных сообщений конкретного приложения), в которой пользователи могут сохранять сообщения, которые не удалось доставить. В результате различные клиенты не будут использовать одну и ту же очередь недоставленных сообщений.
У привязок имеются следующие важные свойства.
DeadLetterQueue. Это свойство является перечислением, которое указывает, запрошена ли очередь недоставленных сообщений. Кроме того, в перечислении содержится тип очереди недоставленных сообщений, если она запрошена. Возможные значения: None, System и Custom. Дополнительные сведения интерпретации этих свойств см. в разделе Использование очередей недоставленных сообщений для обработки сбоев при передаче сообщений
CustomDeadLetterQueue. Это свойство представляет собой универсальный код ресурса (URI) очереди недоставленных сообщений конкретного приложения. Его требуется задавать, если выбрано значение DeadLetterQueue.Custom.
Свойства обработки подозрительных сообщений
Когда служба получает сообщение из целевой очереди в рамках транзакции, служба может по какой-либо причине не обработать это сообщение. В этом случае сообщение возвращается в очередь, чтобы быть считанными снова. Для обработки сообщений, которые часто вызывают сбои, в привязке можно настроить набор свойств обработки подозрительных сообщений. Имеется четыре таких свойства: ReceiveRetryCount, MaxRetryCycles, RetryCycleDelay и ReceiveErrorHandling. Дополнительные сведения данных свойствах см. в разделе Обработка опасных сообщений.
Свойства безопасности
Служба MSMQ реализует собственную модель безопасности, например списки управления доступом в очереди или отправку прошедших проверку подлинности сообщений. В привязке NetMsmqBinding эти свойства безопасности реализованы как часть параметров безопасности транспорта. В привязке имеется два свойства для обеспечения безопасности транспорта: MsmqAuthenticationMode и MsmqProtectionLevel. Значения этих свойств зависят от настройки MSMQ. Дополнительные сведения см. в разделе Защита сообщений с использованием средств обеспечения безопасности транспорта.
Помимо безопасности транспорта само сообщение SOAP можно также защитить с помощью механизмов защиты сообщений. Дополнительные сведения см. в разделе Защита сообщений с использованием средств обеспечения безопасности сообщений.
MsmqTransportSecurity также реализует два свойства: MsmqEncryptionAlgorithm и MsmqHashAlgorithm. Это перечисления различных алгоритмов, позволяющее задать шифрование при передаче сообщений между очередями и хэширование сигнатур.
Другие свойства
Помимо описанных выше свойства предоставляемые привязкой свойства MSMQ включают:
UseSourceJournal: свойство, указывающее, что включено ведение журнала источника. Ведение журнала является функцией MSMQ, отслеживающей сообщения, которые были успешно переданы из очереди передачи;
UseMsmqTracing: свойство, указывающее, что включена трассировка MSMQ. Функция трассировки MSMQ отправляет сообщение с отчетом в очередь отчетов всякий раз, когда сообщение покидает компьютер с диспетчером очереди MSMQ или приходит на него;
QueueTransferProtocol: перечисление протокола, используемого для обмена сообщениями между очередями. Служба MSMQ реализует собственный протокол передачи сообщений между очередями, а также протокол на базе SOAP (SRMP). Протокол SRMP используется при передаче сообщений между очередями с помощью протокола HTTP. Если сообщения между очередями передаются с помощью протокола HTTPS, используется протокол SRMP;
UseActiveDirectory: логическое значение, указывающее, следует ли использовать для разрешения адресов очередей службу каталогов Active Directory. По умолчанию этот режим отключен. Дополнительные сведения см. в разделе Конечные точки служб и адресация очереди.
MsmqIntegrationBinding
Привязка MsmqIntegrationBinding используется в тех случаях, когда конечная точка WCF должна взаимодействовать с существующим приложением MSMQ, написанном с использованием C, C++, COM или интерфейсов API System.Messaging.
Привязка имеет те же свойства, что и NetMsmqBinding. Однако имеются следующие различия:
контракт операции MsmqIntegrationBinding может принимать только один параметр типа MsmqMessage, где параметр типа является типом тела;
большинство свойств собственных сообщений MSMQ доступно в MsmqMessage;
для сериализации и десериализации текста сообщения предоставляются сериализаторы, например XML и ActiveX.
Образец кода
Пошаговые инструкции по созданию служб WCF, использующих MSMQ, см. в следующих разделах.
Как обмениваться сообщениями с конечными точками WCF и приложениями очереди сообщений
Как обменяться сообщениями в очереди с конечными точками WCF
Полный образец кода, демонстрирующий использование MSMQ в WCF, см. в следующих разделах.
См. также
Основные понятия
Конечные точки служб и адресация очереди
Размещение веб-узлов в приложении, использующем очереди