Correlação resposta/solicitação
A correlação de resposta/solicitação é usada com um par Receive/SendReply para implementar uma operação bidirecional em um serviço de fluxo de trabalho e com um par Send/ReceiveReply que invoca uma operação bidirecional em outro serviço da Web. Ao invocar uma operação bidirecional em um serviço WCF, o serviço pode ser um serviço Windows Communication Foundation (WCF) baseado em código imperativo tradicional ou pode ser um serviço de fluxo de trabalho. Para usar a correlação resposta/solicitação, uma associação bidirecional deve ser usada, como BasicHttpBinding. Seja invocando ou implementando uma operação bidirecional, as etapas de inicialização de correlação são semelhantes e são abordadas nesta seção.
Usando Correlação em uma Operação Bidirecional com Receive/SendReply
Um par Receive/SendReply é usado para implementar uma operação bidirecional em um serviço de fluxo de trabalho. O runtime usa a correlação de solicitação-resposta para garantir que a resposta seja despachada para o chamador correto. Quando um fluxo de trabalho é hospedado usando WorkflowServiceHost, que é o caso de serviços de fluxo de trabalho, a inicialização de correlação padrão é suficiente. Nesse cenário, um par Receive/SendReply é usado por um fluxo de trabalho e nenhuma configuração de correlação específica é necessária.
Receive StartOrder = new Receive
{
CanCreateInstance = true,
ServiceContractName = OrderContractName,
OperationName = "StartOrder"
};
SendReply ReplyToStartOrder = new SendReply
{
Request = StartOrder,
Content = … // Contains the return value, if any.
};
// Construct a workflow using StartOrder and ReplyToStartOrder.
Inicializando explicitamente a correlação de solicitação-resposta
Se outras operações bidirecionais estiverem em paralelo, a correlação deverá ser configurada explicitamente. Isso pode ser feito especificando um CorrelationHandle e RequestReplyCorrelationInitializer, ou colocando o Receive/SendReply dentro de um CorrelationScope. Neste exemplo, a correlação de solicitação-resposta é configurada em um par Receive/SendReply.
Variable<CorrelationHandle> RRHandle = new Variable<CorrelationHandle>();
Receive StartOrder = new Receive
{
CanCreateInstance = true,
ServiceContractName = OrderContractName,
OperationName = "StartOrder",
CorrelationInitializers =
{
new RequestReplyCorrelationInitializer
{
CorrelationHandle = RRHandle
}
}
};
SendReply ReplyToStartOrder = new SendReply
{
Request = StartOrder,
Content = … // Contains the return value, if any.
};
// Construct a workflow using StartOrder and ReplyToStartOrder.
Em vez de configurar explicitamente a correlação, uma atividade CorrelationScope pode ser usada. CorrelationScope fornece um CorrelationHandle implícito para as atividades de mensagens que ele contém. Neste exemplo, um par Receive/SendReply está contido em um CorrelationScope. Nenhuma configuração de correlação explícita é necessária.
Receive StartOrder = new Receive
{
CanCreateInstance = true,
ServiceContractName = OrderContractName,
OperationName = "StartOrder"
};
SendReply ReplyToStartOrder = new SendReply
{
Request = StartOrder,
Content = … // Contains the return value, if any.
};
CorrelationScope s = new CorrelationScope
{
Body = new Sequence
{
Activities =
{
StartOrder,
// Activities that create the reply.
ReplyToStartOrder
}
}
};
// Construct a workflow using the CorrelationScope.
Se correlações adicionais forem necessárias, elas poderão ser configuradas usando a propriedade CorrelationInitializers das respectivas atividades de mensagens usando os tipos CorrelationInitializer
desejados.
Usando Correlação em uma Operação Bidirecional com Send/ReceiveReply
Embora a atividade Receive só possa ser usada em um serviço de fluxo de trabalho hospedado por WorkflowServiceHost, Send e o par Send/ReceiveReply podem ser usados em qualquer fluxo de trabalho que deva invocar um método em um serviço Web. Se o fluxo de trabalho for hospedado usando WorkflowServiceHost, a correlação padrão descrita na seção anterior se aplicará, mas se não, a correlação deverá ser configurada explicitamente usando os CorrelationInitializer e CorrelationHandle desejados ou usando o gerenciamento de identificador implícito de o CorrelationScope.
Ao usar Adicionar referência de serviço em um serviço com operações bidirecionais, são geradas atividades que envolvem uma atividade de par Send/ReceiveReply internamente com a correlação de solicitação/resposta explicitamente especificada.