Correlação Solicitação-Resposta
A correlação solicitação-resposta é usada com um Receive/SendReply par para implementar uma operação bidirecional em um serviço de fluxo de trabalho e com um Send/ReceiveReply par que invoca uma operação bidirecional em outro serviço Web. Ao invocar uma operação bidirecional em um serviço WCF, o serviço pode ser um serviço tradicional baseado em código baseado em código do Windows Communication Foundation (WCF) ou pode ser um serviço de fluxo de trabalho. Para usar a correlação solicitação-resposta, uma ligaçã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 Receive/SendReply par é usado para implementar uma operação bidirecional em um serviço de fluxo de trabalho. O tempo de execução usa a correlação solicitação-resposta para garantir que a resposta seja enviada para o chamador correto. Quando um fluxo de trabalho é hospedado usando WorkflowServiceHost, que é o caso dos serviços de fluxo de trabalho, a inicialização de correlação padrão é suficiente. Nesse cenário, um Receive/SendReply par é 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 solicitação-resposta
Se outras operações bidirecionais estiverem em paralelo, a correlação deve ser explicitamente configurada. Isso pode ser feito especificando a CorrelationHandle e RequestReplyCorrelationInitializer, ou colocando oSendReplyReceive/interior de um .CorrelationScope Neste exemplo, a correlação solicitação-resposta é configurada em um Receive/SendReply par.
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 CorrelationScope atividade pode ser usada. CorrelationScope fornece um implícito CorrelationHandle para as atividades de mensagens que ele contém. Neste exemplo, um Receive/SendReply par está contido dentro de um CorrelationScopearquivo . 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 forem necessárias correlações adicionais, elas podem ser configuradas usando a CorrelationInitializers propriedade das respetivas atividades de mensagens usando os tipos desejados CorrelationInitializer
.
Usando correlação em uma operação bidirecional com Send/ReceiveReply
Embora a Receive atividade só possa ser usada em um serviço de fluxo de trabalho hospedado pelo WorkflowServiceHost, Send e o Send/ReceiveReply par possa ser usado 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 aplica, mas se não, a correlação deverá ser configurada explicitamente usando o desejado CorrelationInitializer e CorrelationHandle, ou usando o gerenciamento de identificador implícito do CorrelationScope.
Ao usar Adicionar Referência de Serviço em um serviço com operações bidirecionais, são geradas atividades que envolvem uma Send/ReceiveReply atividade de par internamente com a correlação Solicitação/Resposta especificada explicitamente.