Общие сведения о корреляции
Корреляция - это механизм связи сообщений службы рабочего процесса друг с другом или с состоянием экземпляра приложения, таким как ответ на начальный запрос, или с определенным идентификатором запроса к сохраненному состоянию рабочего процесса обработки запросов. В данном разделе приведены общие сведения о корреляции. В других подразделах этого раздела содержатся дополнительные сведения о каждом из видов корреляции.
Типы корреляции
Корреляция может быть основана на протоколе или на содержимом. При основанной на протоколе корреляции для сопоставления сообщений используются данные, предоставляемые инфраструктурой доставки сообщений. Сообщения, сопоставляемые с помощью корреляции на основе протокола, связываются друг с другом с помощью находящегося в памяти объекта, например RequestContext, или с помощью маркера, предоставляемого транспортным протоколом. Корреляции на основе содержимого связывает сообщения друг с другом с помощью данных, задаваемых приложением. Сообщения, сопоставляемые с помощью корреляции на основе содержимого, связываются друг с другом с помощью содержащихся в сообщении данных, определяемых приложением, например по номеру клиента.
Действия, участвующие в корреляции, применяют для объединения действий обмена сообщениями дескриптор CorrelationHandle. Например, для действия Send, используемого для вызова службы, и следующего за ним действия Receive, используемого для получения обратного вызова от службы, применяется один и тот же дескриптор CorrelationHandle. Этот основной шаблон применяется как для корреляции на основе содержимого, так и для корреляции на основе протокола. Дескриптор взаимосвязи может быть установлен для каждого действия явно, или же действия могут содержаться в действии CorrelationScope. Дескрипторами взаимосвязи действий, содержащихся в CorrelationScope, управляет CorrelationScope, для них не требуется явно задавать значение CorrelationHandle. Область CorrelationScope реализует управление дескрипторами CorrelationHandle для корреляции «запрос-ответ» и одного дополнительного типа корреляции. Для служб рабочих процессов, размещенных с помощью WorkflowServiceHost, используется то же управление корреляцией по умолчанию, что и для действия CorrelationScope. Это управление корреляцией по умолчанию, как правило, приводит к тому, что во многих сценариях использования для действий обмена сообщениями в области CorrelationScope или для службы рабочего процесса не требуется задавать дескриптор CorrelationHandle, если только несколько действий обмена сообщениями не выполняются параллельно или с перекрытием (например, два параллельных действия Receive или два действия Send, за которыми следует два действия Receive). Дополнительные сведения о корреляции по умолчанию содержатся в подразделах этого раздела, описывающих каждый из видов корреляции по отдельности. Дополнительные сведения о действиях обмена сообщениями см. в разделе "Действия обмена сообщениями" и "Практическое руководство. Создание службы рабочих процессов с помощью действий обмена сообщениями".
Корреляция, основанная на протоколе
Основанная на протоколе корреляция использует транспортный механизм для связи сообщений друг с другом и с соответствующим экземпляром. Некоторые предоставляемые системой корреляции на основе протокола включают корреляции типа «запрос-ответ» и корреляции на основе контекста. Корреляции «запрос-ответ» используются для сопоставления пары действий обмена сообщениями с операцией двунаправленной формы, например действие Send может составлять пару с действием ReceiveReply, а действие Receive может составлять пару с действием SendReply. Конструктор рабочих процессов Visual Studio также предоставляет набор шаблонов действий для быстрого реализации этого шаблона. Корреляция на основе контекста основана на механизме обмена контекстом, описанном в спецификации протокола Exchange контекста .NET. Для использования корреляции на основе контекста в конечной точке необходимо использовать привязку на основе контекста, например BasicHttpContextBinding, WSHttpContextBinding или NetTcpContextBinding.
Дополнительные сведения о корреляции протоколов см. в разделе "Устойчивый дуплекс " и "Ответ на запрос". Дополнительные сведения об использовании шаблонов действий конструктора рабочих процессов Visual Studio см. в разделе "Действия обмена сообщениями". Пример кода см. в примере NetContextExchangeCorrelation .
Корреляция по содержимому
При корреляции, основанной на содержимом, для сопоставления сообщения с конкретным экземпляром используется часть содержащихся в сообщении данных. В отличие от корреляции на основе протокола, при использовании корреляции на основе содержимого разработчик приложения должен явно указать, где в каждом из сопоставляемых сообщений находится такая часть данных. В действиях, использующих корреляцию на основе содержимого, эти данные сообщения задаются с помощью набора MessageQuerySet. Корреляция на основе содержимого полезна при взаимодействии со службами, в которых не применяется ни одна из контекстных привязок, таких как BasicHttpContextBinding.