Compartilhar via


Correlação resposta/solicitação

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 WCF tradicional, baseado em código imperativo, ou pode ser um serviço de fluxo de trabalho. Para usar a correlação solicitação-resposta, 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 Receive/SendReply par é usado para implementar uma operação bidirecional em um serviço de fluxo de trabalho. O runtime 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 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 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 CorrelationHandle implícito para as atividades de mensagens que ele contém. Neste exemplo, um par Receive/SendReply está contido dentro de 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 forem necessárias correlações adicionais, elas poderão ser configuradas usando a CorrelationInitializers propriedade das respectivas atividades de mensagens usando os tipos desejados CorrelationInitializer .

Usando correlação em uma operação de Two-Way com Enviar/ReceberResposta

Embora a Receive atividade só possa ser usada em um serviço de workflow hospedado por WorkflowServiceHost, Send e o conjunto Send/ReceiveReply pode ser usado em qualquer fluxo de trabalho que precise invocar um método em um serviço web. Se o fluxo de trabalho estiver hospedado usando WorkflowServiceHost, a correlação padrão descrita na seção anterior será aplicada. Caso contrário, a correlação deverá ser configurada explicitamente usando CorrelationInitializer e CorrelationHandle, ou através da gestão implícita de handles do CorrelationScope.

Ao usar Adicionar Referência de Serviço em um serviço com operações bidirecionais, são geradas atividades que encapsulam internamente um par de atividades Send/ReceiveReply com a correlação Solicitação/Resposta explicitamente especificada.