Compartir por


Correlación entre solicitud y respuesta

La correlación de solicitud-respuesta se usa con un Receive/SendReply par para implementar una operación bidireccional en un servicio de flujo de trabajo y con un Send/ReceiveReply par que invoca una operación bidireccional en otro servicio web. Al invocar una operación bidireccional en un servicio WCF, el servicio puede ser un servicio Windows Communication Foundation (WCF) imperativo tradicional basado en código, o puede ser un servicio de flujo de trabajo. Para usar la correlación de solicitud-respuesta, se debe usar un enlace bidireccional, como BasicHttpBinding. Ya sea que se invoque o se implemente una operación bidireccional, los pasos de inicialización de la correlación son similares y se tratan en esta sección.

Uso de la correlación en una operación de Two-Way con Receive/SendReply

Un Receive/SendReply par se usa para implementar una operación bidireccional en un servicio de flujo de trabajo. El tiempo de ejecución usa la correlación de solicitud-respuesta para asegurarse de que la respuesta se envía al autor de la llamada correcta. Cuando se hospeda un flujo de trabajo mediante WorkflowServiceHost, que es el caso de los servicios de flujo de trabajo, la inicialización de correlación predeterminada es suficiente. En este escenario, un flujo de trabajo usa un Receive/SendReply par y no se requiere ninguna configuración de correlación específica.

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.  

Inicializar explícitamente una correlación de solicitud-respuesta

Si otras operaciones bidireccionales están en paralelo, se debe configurar explícitamente la correlación. Esto se puede hacer especificando un CorrelationHandle y un RequestReplyCorrelationInitializer, o colocando el Receive/SendReply dentro de un CorrelationScope. En este ejemplo, la correlación de solicitud-respuesta se configura en un Receive/SendReply par.

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.  

En lugar de configurar explícitamente la correlación, se puede usar una CorrelationScope actividad. CorrelationScope proporciona un valor implícito CorrelationHandle para las actividades de mensajería que contiene. En este ejemplo, un par Receive/SendReply está contenido dentro de un CorrelationScope. No se requiere ninguna configuración de correlación explícita.

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 se requieren correlaciones adicionales, se pueden configurar utilizando la propiedad CorrelationInitializers de las actividades de mensajería correspondientes y los tipos deseados CorrelationInitializer.

Utilizar correlación en una operación bidireccional con Send/ReceiveReply

Aunque la Receive actividad solo se puede usar en un servicio de flujo de trabajo hospedado por WorkflowServiceHost, y el par SendSend/ReceiveReply se puede usar en cualquier flujo de trabajo que deba invocar un método en un Servicio Web. Si el flujo de trabajo se hospeda mediante WorkflowServiceHost , se aplica la correlación predeterminada descrita en la sección anterior, pero, si no es así, la correlación debe configurarse explícitamente mediante los valores deseados CorrelationInitializer y CorrelationHandle, o mediante la administración implícita del identificador de CorrelationScope.

Cuando se usa Agregar referencia de servicio en un servicio con operaciones bidireccionales, se generan actividades que encapsulan una actividad de pares internamente, con la correlación solicitud/respuesta especificada explícitamente.