Partager via


Corrélation demande-réponse

La corrélation de demande-réponse est utilisée avec une Receive/SendReply paire pour implémenter une opération bidirectionnelle dans un service de flux de travail et avec une Send/ReceiveReply paire qui appelle une opération bidirectionnelle dans un autre service Web. Lorsqu'on invoque une opération bidirectionnelle dans un service WCF, le service peut être soit un service Windows Communication Foundation (WCF) implémenté en code impératif, soit un service de flux de travail. Pour utiliser la corrélation demande-réponse, une liaison bidirectionnelle, comme BasicHttpBinding, doit être utilisée. Si vous appelez ou implémentez une opération bidirectionnelle, les étapes d’initialisation de corrélation sont similaires et sont traitées dans cette section.

Utilisation de la corrélation dans une opération bidirectionnelle avec Receive/SendReply

Une Receive/SendReply paire est utilisée pour implémenter une opération bidirectionnelle dans un service de flux de travail. Le runtime utilise la corrélation de demande-réponse pour s’assurer que la réponse est distribuée à l’appelant approprié. Lorsqu’un flux de travail est hébergé à l’aide WorkflowServiceHost, ce qui est le cas pour les services de flux de travail, l’initialisation de corrélation par défaut est suffisante. Dans ce scénario, une Receive/SendReply paire est utilisée par un flux de travail et aucune configuration de corrélation spécifique n’est requise.

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.  

Initialisation explicite de la corrélation demande-réponse

Si d’autres opérations bidirectionnelles sont en parallèle, la corrélation doit être configurée explicitement. Cela peut être fait en spécifiant un CorrelationHandle et un RequestReplyCorrelationInitializer, ou en plaçant le Receive/SendReply à l'intérieur d'un CorrelationScope. Dans cet exemple, la corrélation demande-réponse est configurée sur une Receive/SendReply paire.

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.  

Au lieu de configurer explicitement la corrélation, une CorrelationScope activité peut être utilisée. CorrelationScope fournit un CorrelationHandle implicite aux activités de messagerie qu’il contient. Dans cet exemple, une Receive/SendReply paire est contenue à l’intérieur d’un CorrelationScope. Aucune configuration de corrélation explicite n’est requise.

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.  

Si des corrélations supplémentaires sont requises, elles peuvent être configurées à l’aide de la CorrelationInitializers propriété des activités de messagerie respectives à l’aide des types souhaités CorrelationInitializer .

Utilisation de la corrélation dans une opération bidirectionnelle avec Send/ReceiveReply

Bien que l’activité Receive ne puisse être utilisée que dans un service de flux de travail hébergé par WorkflowServiceHost, Send et la Send/ReceiveReply paire peut être utilisée dans n’importe quel flux de travail qui doit appeler une méthode sur un service Web. Si le flux de travail est hébergé à l'aide de WorkflowServiceHost, alors la corrélation par défaut décrite dans la section précédente s'applique. Sinon, la corrélation doit être configurée explicitement en utilisant CorrelationInitializer et CorrelationHandle souhaités, ou en recourant à la gestion implicite du handle de CorrelationScope.

Lorsque vous utilisez Add Service Reference sur un service avec des opérations bidirectionnelles, les activités sont générées pour encapsuler une paire d'activités Send/ReceiveReply en interne avec la corrélation de demande/réponse spécifiée explicitement.