Обмен контекстом
Данный раздел относится к версии Windows Workflow Foundation 4.
Корреляция контекста реализована на основе механизма обмена контекстом, описанного в разделе Спецификации протокола обмена контекстом .NET. Для связывания сообщений с нужным экземпляром корреляция контекста использует известный заголовок контекста или файл cookie. Для реализации корреляции контекста необходимо использование привязки на основе контекста, например BasicHttpContextBinding, WSHttpContextBinding или NetTcpContextBinding для конечных точек, предоставляемых для WorkflowServiceHost. В этом разделе описана работа корреляции контекста с действиями обмена сообщениями в службе рабочего процесса.
Использование корреляции контекста
Корреляция контекста используется в том случае, если клиенту необходимо выполнять повторяющиеся вызовы к службе рабочего процесса, а ее размещение было выполнено по одной из привязок контекста. Этот тип корреляции инициализируется с помощью пары Receive/SendReply в службе рабочего процесса. Контекст возвращается клиенту вместе с ответом, после чего он присоединяет этот контекст к последующим вызовам службы.
Настройка корреляции контекста в службе рабочего процесса
Корреляция контекста инициализируется с помощью объекта ContextCorrelationInitializer, связанного с действием SendReply, которое отвечает на исходное входящее сообщение. В следующем примере выполняется настройка SendReply для инициализации корреляции контекста.
Variable<string> Item = new Variable<string>();
Variable<CorrelationHandle> OrderHandle = new Variable<CorrelationHandle>();
Receive StartOrder = new Receive
{
CanCreateInstance = true,
ServiceContractName = "IOrderService",
OperationName = "StartOrder"
};
SendReply ReplyToStartOrder = new SendReply
{
Request = StartOrder,
CorrelationInitializers =
{
new ContextCorrelationInitializer
{
CorrelationHandle = OrderHandle
}
}
};
![]() |
---|
Обратите внимание, что для пары Receive/SendReply используется корреляция запросов и ответов по умолчанию, которая обеспечивается при явном управлении CorrelationHandleWorkflowServiceHost. Дополнительные сведения см. в разделе Запрос-ответ. |
Последующие действия Receive в службе рабочего процесса могут ссылаться на CorrelationHandle, инициализированный SendReply в предыдущем примере.
Receive AddItem = new Receive
{
ServiceContractName = "IOrderService",
OperationName = "AddItem",
CorrelatesWith = OrderHandle
};
Затем конечная точка настраивается в WorkflowServiceHost для использования привязки на основе контекста, например BasicHttpContextBinding.
<endpoint
contract=”IOrderContract”
binding = “basicHttpContextBinding”
address=”https://localhost:8080/OrderService” />
Настройка корреляции контекста в клиенте рабочего процесса
Если клиентом является другой рабочий процесс, то корреляцию контекста необходимо настроить также и для клиента. В рабочем процессе клиента ReceiveReply пару Send/ReceiveReply, которая производила первоначальный вызов службы рабочего процесса, необходимо настроить с помощью ContextCorrelationInitializer.
Variable<CorrelationHandle> cchandle = new Variable<CorrelationHandle>();
Send request = new Send
{
// Activity configuration omitted.
};
ReceiveReply reply = new ReceiveReply
{
Request = request,
CorrelationInitializers =
{
new ContextCorrelationInitializer
{
CorrelationHandle = cchandle
}
}
};
После инициализации корреляции все последующие действия Send могут использовать CorrelationHandle для вызова методов для этого же экземпляра службы.
Send request2 = new Send
{
CorrelatesWith = cchandle,
// Remaining activity configuration omitted.
};
Обратите внимание, что в этих примерах корреляция контекста была настроена явным образом. Если рабочий процесс клиента не размещен в WorkflowServiceHost, то корреляция должна быть настроена явным образом, если только в действии CorrelationScope не содержатся другие действия.
Если клиент, который выполняет вызовы службы рабочих процессов, сам не является рабочим процессом, то он может производить повторяющиеся вызовы при условии, что контекст, возвращенный первым вызовом службы рабочих процессов, при последующих вызовах явным образом передается обратно. Прокси, сформированные при добавлении ссылки на службу в хранилище Visual Studio 2010, которые передают этот контекст по умолчанию.