Request/Reply

Le informazioni contenute in questo argomento sono valide per Windows Workflow Foundation 4.

La correlazione request/reply viene utilizzata 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. Se si richiama un'operazione bidirezionale in un servizio WCF, quest'ultimo può essere un servizio Windows Communication Foundation (WCF) imperativo tradizionale basato sul codice o un servizio flusso di lavoro. Per utilizzare la correlazione request/reply è necessario utilizzare 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 utilizzata per implementare un'operazione bidirezionale in un servizio flusso di lavoro. Il runtime utilizza 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 utilizzata 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 RequestReplyCorrelationInitializero 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 utilizzare un'attività CorrelationScope. CorrelationScope fornisce un elemento 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 utilizzando 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 utilizzata solo in un servizio flusso di lavoro ospitato da WorkflowServiceHost, Send, la coppia Send/ReceiveReply può essere utilizzata in qualsiasi flusso di lavoro che deve richiamare un metodo su un servizio Web. Se il flusso di lavoro è ospitato utilizzando 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 utilizza 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.