Partager via


Corrélation demande-réponse

La corrélation demande-réponse est utilisée avec une paire Receive/SendReply pour implémenter une opération bidirectionnelle dans un service de workflow et avec une paire Send/ReceiveReply qui appelle une opération bidirectionnelle dans un autre service web. Lors de l’appel d’une opération bidirectionnelle dans un service WCF, le service peut être soit un service WCF basé sur le code impératif traditionnel, soit un service de workflow. Pour utiliser la corrélation demande-réponse, une liaison bidirectionnelle doit être utilisée, telle que BasicHttpBinding. Qu'il s'agisse d'appeler ou d'implémenter une opération bidirectionnelle, les étapes d'initialisation de la corrélation sont similaires ; elles sont présentées dans cette section.

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

Une paire Receive/SendReply sert à implémenter une opération bidirectionnelle dans un service de workflow. L'exécution utilise la corrélation demande-réponse pour vérifier que la réponse est distribuée à l'appelant approprié. Lorsqu'un workflow est hébergé à l'aide de WorkflowServiceHost, ce qui est le cas des services de workflow, l'initialisation de la corrélation par défaut est suffisante. Dans ce scénario, une paire Receive/SendReply est utilisée par un workflow, et aucune configuration de corrélation spécifique n'est nécessaire.

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 existent en parallèle, la corrélation doit être configurée de manière explicite. Pour ce faire, spécifiez un objet CorrelationHandle et un objet RequestReplyCorrelationInitializer, ou placez la paire Receive/SendReply dans un objet CorrelationScope. Dans cet exemple, la corrélation requête-réponse est configurée sur une paire 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.  

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

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 nécessaire, des corrélations supplémentaires peuvent être configurées à l'aide de la propriété CorrelationInitializers des activités de messagerie respectives utilisant les types CorrelationInitializer souhaités.

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

Alors que l'activité Receive ne peut être utilisée que dans un service de workflow hébergé par WorkflowServiceHost, l'activité Send et la paire Send/ReceiveReply peuvent être utilisées dans tout workflow qui doit appeler une méthode sur un service Web. Si le workflow est hébergé à l'aide de l'objet WorkflowServiceHost, la corrélation par défaut décrite dans la section précédente s'applique, mais si ce n'est pas le cas, la corrélation doit être configurée soit de manière explicite à l'aide des objets CorrelationInitializer et CorrelationHandle souhaités, soit en utilisant la gestion de handle implicite de l'objet CorrelationScope.

Lors de l'utilisation de la fonction Ajouter une référence de service sur un service ayant des opérations bidirectionnelles, les activités générées encapsulent en interne une paire d'activités Send/ReceiveReply et la corrélation requête-réponse est spécifiée de manière explicite.