Freigeben über


Anforderung-Antwort-Korrelation

Die Anforderung-Antwort-Korrelation wird mit einem Receive/SendReply-Paar verwendet, um einen bidirektionalen Vorgang in einem Workflowdienst zu implementieren, und mit einem Send/ReceiveReply-Paar, um einen bidirektionalen Vorgang in einem anderen Webdienst aufzurufen. Wenn in einem WCF-Dienst ein bidirektionaler Vorgang aufgerufen wird, kann der Dienst entweder ein herkömmlicher obligatorischer -Dienst sein, der auf Code basiert, oder es kann sich um einen Workflowdienst handeln. Zum Verwenden der Anforderung-Antwort-Korrelation muss eine bidirektionale Bindung wie BasicHttpBinding verwendet werden. Die Schritte zum Initialisieren der Korrelation sind für das Aufrufen und Implementieren eines bidirektionalen Vorgangs gleich und werden in diesem Abschnitt behandelt.

Verwenden der Korrelation in einem bidirektionalen Vorgang mit Receive/SendReply

Ein Receive/SendReply-Paar wird verwendet, um in einem Workflowdienst einen bidirektionalen Vorgang zu implementieren. Die Laufzeit verwendet die Anforderung-Antwort-Korrelation, um sicherzustellen, dass die Antwort an den richtigen Aufrufer weitergeleitet wird. Wenn ein Workflow dann mit WorkflowServiceHost gehostet wird, beispielsweise Workflowdienste, ist die standardmäßige Korrelationsinitialisierung ausreichend. In diesem Szenario wird ein Receive/SendReply-Paar von einem Workflow verwendet, und es ist keine spezielle Korrelationskonfiguration erforderlich.

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.  

Explizites Initialisieren der Anforderung-Antwort-Korrelation

Wenn andere bidirektionale Vorgänge parallel laufen, sollte die Korrelation explizit konfiguriert werden. Geben Sie dazu CorrelationHandle und RequestReplyCorrelationInitializer an, oder fügen Sie das Receive/SendReply-Paar in CorrelationScope ein. In diesem Beispiel wird die Anforderung-Antwort-Korrelation für ein Receive/SendReply-Paar konfiguriert.

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.  

Anstatt die Korrelation explizit zu konfigurieren, können Sie auch eine CorrelationScope-Aktivität verwenden. CorrelationScope stellt ein implizites CorrelationHandle-Objekt für die darin enthaltenen Messagingaktivitäten bereit. In diesem Beispiel ist ein Receive/SendReply-Paar in einem CorrelationScope-Objekt enthalten. Es ist keine explizite Korrelationskonfiguration erforderlich.

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.  

Falls zusätzliche Korrelationen erforderlich sind, können diese mit der CorrelationInitializers-Eigenschaft der jeweiligen Messagingaktivitäten konfiguriert werden, indem die gewünschten CorrelationInitializer-Typen verwendet werden.

Verwenden der Korrelation in einem bidirektionalen Vorgang mit Send/ReceiveReply

Während die Receive-Aktivität nur in einem von WorkflowServiceHost gehosteten Workflowdienst verwendet werden kann, können Send und das Send/ReceiveReply-Paar in jedem Workflow verwendet werden, der eine Methode auf einem Webdienst aufrufen muss. Wenn der Workflow mit WorkflowServiceHost gehostet wird, gilt die im vorherigen Abschnitt beschriebene Standardkorrelation. Falls nicht, muss die Korrelation entweder explizit mit den gewünschten Objekten CorrelationInitializer und CorrelationHandle oder per impliziter Handleverwaltung von CorrelationScope konfiguriert werden.

Beim Verwenden von Dienstverweis hinzufügen für einen Dienst mit bidirektionalen Vorgängen, werden Aktivitäten generiert, die aus der Send/ReceiveReply-Paaraktivität intern mit der explizit angegebenen Anforderung-Antwort-Korrelation einen Wrapper erstellen.