Partilhar via


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.