Очереди в WCF
В этом разделе описывается использование связи в очереди в Windows Communication Foundation (WCF).
Очереди в качестве привязки транспорта WCF
В WCF контракты указывают, что обменивается. Контракты представляют собой обмен сообщениями, связанными с бизнес-требованиями или конкретными приложениями. Механизм, с помощью которого осуществляется обмен сообщениями, задается в привязках. Привязки в WCF инкапсулируют сведения об обмене сообщениями. Они предоставляют доступ к элементам конфигурации, с помощью которых пользователи могут управлять различными аспектами транспорта или протокола, которые представляются привязками. Очередь в WCF рассматривается как любая другая транспортная привязка, которая является большим преимуществом для многих приложений очереди. В наше время многие приложения с использованием очередей разрабатываются не так, как другие распределенные приложения на базе удаленного вызова процедур, что затрудняет их понимание и обслуживание. При использовании WCF стиль написания распределенного приложения значительно отличается, что упрощает выполнение и обслуживание. Более того, отделение механизма обмена данными от бизнес-логики упрощает настройку транспорта или внесение изменений в него, не затрагивая код, относящийся к предметной области. На следующем рисунке показана структура службы и клиента WCF, которые используют MSMQ в качестве транспорта.
Как видно из этого рисунка, клиент и служба должны определять только семантику приложения, т. е. контракт и реализацию. Служба настраивает поддерживающую очереди привязку с использованием нужных параметров. Клиент использует средство служебной программы метаданных ServiceModel (Svcutil.exe) для создания клиента WCF в службе и создания файла конфигурации, описывающего привязки для отправки сообщений в службу. Таким образом, чтобы отправить сообщение в очереди, клиент создает экземпляр клиента WCF и вызывает операцию в ней. В результате сообщение отправляется в очередь передачи, а затем передается в целевую очередь. Все сложные механизмы взаимодействия с использованием очередей оказываются скрытыми от приложения, которое отправляет и получает сообщения.
Предостережения о привязке в очереди в WCF включают:
Все операции службы должны быть односторонними, так как привязка по умолчанию в WCF не поддерживает дуплексное взаимодействие с помощью очередей. Пример двустороннего взаимодействия (двустороннее взаимодействие) иллюстрирует использование двухсторонней связи для реализации дуплексного взаимодействия с помощью очередей.
Чтобы создать клиент WCF с помощью обмена метаданными, требуется дополнительная конечная точка HTTP в службе, чтобы ее можно было запрашивать непосредственно для создания клиента WCF и получения сведений о привязке для соответствующей настройки связи в очереди.
В зависимости от привязки в очереди требуется дополнительная конфигурация за пределами WCF. Например, класс, который поставляется с WCF, NetMsmqBinding требует настройки привязок, а также минимальной настройки очереди сообщений (MSMQ).
В следующих разделах описываются определенные привязки, отправленные в очередь с WCF, которые основаны на MSMQ.
MSMQ
Транспорт в очереди в WCF использует MSMQ для связи с очередью.
MSMQ поставляется как дополнительный компонент Windows и выполняется как служба NT. MSMQ помещает передаваемые сообщения в очередь передачи и доставляет их в целевую очередь. Диспетчеры очередей MSMQ реализуют надежный протокол передачи сообщений, благодаря которому сообщения не могут быть потеряны при передаче. Этот протокол может быть собственным или основанным на SOAP, например как протокол SRMP.
В MSMQ, очереди могут быть транзакционными и нетранзакционными. Транзакционная очередь позволяет перехватывать и доставлять сообщение в транзакции, а затем продолжительное время хранить его в очереди. Сообщения, отправляемые в транзакционную очередь, передаются только один раз в заданном порядке. С помощью нетранзакционных очередей можно передавать, как неустойчивые, так и устойчивые сообщения. Сообщение, переданное в нетранзакционную очередь, не содержит каких-либо механизмов подтверждения надежной передачи, поэтому такое сообщение может быть потеряно.
Кроме того, очереди MSMQ можно защищать с помощью удостоверений Windows, зарегистрированных в службе каталогов Active Directory. При установке MSMQ можно установить интеграцию с Active Directory, для чего компьютер должен входить в домен Windows.
Дополнительные сведения об MSMQ см. в статье об установке очереди сообщений (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 или System.Messaging API.
Привязка имеет те же свойства, что и NetMsmqBinding
. Однако имеются следующие различия:
контракт операции
MsmqIntegrationBinding
может принимать только один параметр типа MsmqMessage<T>, где параметр типа является типом тела;большинство свойств собственных сообщений MSMQ доступно в MsmqMessage<T>;
для сериализации и десериализации тела сообщения предоставляются сериализаторы, например XML и ActiveX.
Пример кода
Пошаговые инструкции по созданию служб WCF, использующих MSMQ, см. в следующих разделах.
Практическое руководство. Обмен сообщениями с конечными точками WCF и приложениями очереди сообщений
Практическое руководство. Обмен сообщениями в очереди с конечными точками WCF
Полный образец кода, демонстрирующий использование MSMQ в WCF, см. в следующих разделах.