Share via


Correlazione request/reply

La correlazione request/reply viene usata con una coppia Receive/SendReply per implementare un'operazione bidirezionale in un servizio flusso di lavoro e con una coppia Send/ReceiveReply che richiama un'operazione bidirezionale in un altro servizio Web. Quando si richiama un'operazione bidirezionale in un servizio WCF, il servizio può essere un servizio imperativo tradizionale Windows Communication Foundation (WCF) basato sul codice o un servizio flusso di lavoro. Per usare la correlazione request/reply è necessario usare un'associazione bidirezionale, ad esempio BasicHttpBinding. Se si richiama o implementa un'operazione bidirezionale, i passaggi dell'inizializzazione della correlazione sono simili e vengono trattati in questa sezione.

Utilizzo della correlazione in un'operazione bidirezionale con Receive/SendReply

Una coppia Receive/SendReply viene usata per implementare un'operazione bidirezionale in un servizio flusso di lavoro. Il runtime usa la correlazione request/reply per garantire che la risposta venga inviata al chiamante corretto. Se un flusso di lavoro viene ospitato mediante WorkflowServiceHost, come nel caso dei servizi flusso di lavoro, è sufficiente l'inizializzazione della correlazione predefinita. In questo scenario, una coppia Receive/SendReply viene usata da un flusso di lavoro e non è richiesta alcuna configurazione di correlazione specifica.

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.  

Inizializzazione esplicita della correlazione Request/Reply

Se altre operazioni bidirezionali vengono eseguite in parallelo, è necessario configurare la correlazione in modo esplicito. A tale scopo è possibile specificare un elemento CorrelationHandle e un elemento RequestReplyCorrelationInitializer o posizionare l'elemento Receive/SendReply all'interno di un elemento CorrelationScope. In questo esempio, la correlazione request-reply viene configurata su una coppia 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.  

Anziché configurare la correlazione in modo esplicito, è possibile usare un'attività CorrelationScope. CorrelationScope fornisce un oggetto CorrelationHandle implicito per le attività della messaggistica in esso contenute. In questo esempio, una coppia Receive/SendReply è contenuta in un elemento CorrelationScope. Non è richiesta alcuna configurazione di correlazione esplicita.

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 sono necessarie ulteriori correlazioni, è possibile configurarle usando la proprietà CorrelationInitializers delle rispettive attività di messaggistica mediante i tipi CorrelationInitializer desiderati.

Utilizzo della correlazione in un'operazione bidirezionale con Send/ReceiveReply

Mentre l'attività Receive può essere usata solo in un servizio flusso di lavoro ospitato da WorkflowServiceHost, Send, la coppia Send/ReceiveReply può essere usata in qualsiasi flusso di lavoro che deve richiamare un metodo su un servizio Web. Se il flusso di lavoro è ospitato usando WorkflowServiceHost, viene applicata la correlazione predefinita descritta nella sezione precedente. In caso contrario, è necessario configurare la correlazione in modo esplicito mediante gli elementi CorrelationInitializer e CorrelationHandleoppure tramite la gestione esplicita dell'handle dell'elemento CorrelationScope.

Se si usa Aggiungi riferimento al servizio in un servizio con operazioni bidirezionali, vengono generate attività che eseguono il wrapping di un'attività della coppia Send/ReceiveReply a livello interno con la correlazione Request/Reply specificata in modo esplicito.