Compartir a través de


Correlación entre solicitud y respuesta

La correlación de solicitud-respuesta se utiliza con un par Receive/SendReply para implementar una operación bidireccional en un servicio de flujo de trabajo y con un par Send/ReceiveReply 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 utilizar la correlación de solicitud-respuesta, debe usarse un enlace bidireccional, como BasicHttpBinding. Ya invoque o implemente una operación bidireccional, los pasos de inicialización de la correlación son similares y se cubren en esta sección.

Utilizar correlación en una operación bidireccional con Receive/SendReply

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

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 se producen otras operaciones bidireccionales en paralelo, la correlación se debería configurar de forma explícita. Esto se puede hacer especificando CorrelationHandle y RequestReplyCorrelationInitializer, o colocando Receive/SendReply dentro de CorrelationScope. En este ejemplo, la correlación de solicitud-respuesta se configura en un par 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.  

En lugar de configurar explícitamente la correlación, se puede usar una actividad CorrelationScope. CorrelationScope proporciona un CorrelationHandle implícito para las actividades de mensajería que contiene. En este ejemplo, se incluye un par Receive/SendReply dentro de 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 mediante la propiedad CorrelationInitializers de las actividades de mensajería respectivas utilizando los tipos CorrelationInitializer deseados.

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

Aunque la actividad Receive solo se puede utilizar en un servicio de flujo de trabajo hospedado por WorkflowServiceHost, se pueden usar Send y el par Send/ReceiveReply en cualquier flujo de trabajo que deba invocar un método en un servicio web. Si el flujo de trabajo se hospeda utilizando WorkflowServiceHost, se aplica la correlación predeterminada descrita en la sección anterior; si no es así, hay que configurar la correlación utilizando explícitamente las clases CorrelationInitializer y CorrelationHandle deseadas, o utilizando la administración de control implícita de CorrelationScope.

Al utilizar Agregar referencia de servicio en un servicio con operaciones bidireccionales, se generan actividades que ajustan internamente una actividad del par Send/ReceiveReply con la correlación solicitud-respuesta especificada explícitamente.