Compartilhar via


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.