Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las actividades de mensajería permiten que los flujos de trabajo envíen y reciban mensajes WCF. Al agregar actividades de mensajería a un flujo de trabajo, puede modelar cualquier patrón de intercambio de mensajes arbitrariomente complejo (MEP).
Patrones de intercambio de mensajes
Hay tres patrones básicos de intercambio de mensajes:
Datagrama: cuando se usa el datagrama MEP, el cliente envía un mensaje al servicio, pero el servicio no responde. Esto a veces se denomina "fuego y olvido". Un intercambio de este tipo es uno que exige una confirmación fuera de banda de entrega correcta. Es posible que el mensaje se pierda en tránsito y nunca llegue al servicio. Si el cliente envía correctamente un mensaje, no garantiza que el servicio haya recibido el mensaje. El datagrama es una unidad de creación fundamental para la mensajería, ya que puede compilar sus propios MEP sobre él.
Request-Response : cuando se usa el MEP request-response, el cliente envía un mensaje al servicio, el servicio realiza el procesamiento necesario y, a continuación, devuelve una respuesta al cliente. El patrón consta de pares de solicitud-respuesta. Algunos ejemplos de llamadas de solicitud-respuesta son llamadas a procedimientos remotos (RPC) y solicitudes GET del explorador. Este patrón también se conoce como dúplex medio.
Dúplex : cuando se usa el MEP dúplex, el cliente y el servicio pueden enviar mensajes entre sí en cualquier orden. El MEP de dúplex es como una conversación telefónica, donde cada palabra que se pronuncia es un mensaje.
Las actividades de mensajería le permiten implementar cualquiera de estos MEP básicos, así como cualquier MEP arbitrariamente complejo.
Actividades de mensajería
.NET Framework 4.6.1 define las siguientes actividades de mensajería:
SendReply - Use la SendReply actividad para enviar una respuesta a un mensaje recibido. Esta actividad la emplean los servicios de flujo de trabajo al implementar un MEP de solicitud/respuesta.
ReceiveReply - Use la ReceiveReply actividad para recibir un mensaje de respuesta. Esta actividad la emplean los clientes de servicios de flujo de trabajo al implementar un MEP de solicitud/respuesta.
Actividades de mensajería y patrones de intercambio de mensajes
Un MEP de datagrama implica que un cliente envía un mensaje y un servicio recibe el mensaje. Si el cliente es un flujo de trabajo, use una Send actividad para enviar el mensaje. Para recibir ese mensaje en un flujo de trabajo, use una Receive actividad. Las actividades Send y Receive tienen cada una una propiedad denominada Content
. Esta propiedad contiene los datos que se envían o reciben. Al implementar el MEP de solicitud-respuesta, tanto el cliente como el servicio usan pares de actividades. El cliente usa una Send actividad para enviar el mensaje y una ReceiveReply actividad para recibir la respuesta del servicio. Estas dos actividades se asocian entre sí mediante la Request propiedad . Esta propiedad se establece en la Send actividad que envió el mensaje original. El servicio también usa un par de actividades asociadas: Receive y SendReply. Estas dos actividades están asociadas por la Request propiedad . Esta propiedad se asigna a la Receive actividad que recibió el mensaje original. Las actividades ReceiveReply y SendReply, como Send y Receive, le permiten enviar una instancia Message o un tipo de contrato de mensaje.
Debido a la naturaleza de larga duración de los flujos de trabajo, es importante que el patrón dúplex de comunicación admita también conversaciones de larga duración. Para soportar conversaciones de larga duración, los clientes que inician la conversación deben dar al servicio la posibilidad de devolverle la llamada más adelante, cuando los datos estén disponibles. Por ejemplo, se envía una solicitud de pedido de compra para la aprobación del administrador, pero es posible que no se procese durante un día, una semana o incluso un año; el flujo de trabajo que administra la aprobación del pedido de compra debe saber reanudarse después de que se dé la aprobación. Este patrón de comunicación dúplex se admite en flujos de trabajo que usan correlación. Para implementar un patrón dúplex, use las actividades Send y Receive. En la Receive actividad, inicialice una correlación mediante CorrelationHandle. En la actividad Send, establezca ese controlador de correlación como valor de propiedad CorrelatesWith. Para obtener más información, vea Durable Duplex.
Nota:
La implementación del flujo de trabajo de dúplex mediante una correlación de devolución de llamada ("dúplex duradero") está pensada para conversaciones de larga ejecución. Esto no es igual que el dúplex de WCF con contratos de devolución de llamada, donde la conversación es de ejecución reducida (la duración del canal).
Actividades de mensajería y formato de mensajes
Las actividades Receive y ReceiveReply tienen una propiedad denominada Content
. Esta propiedad es de tipo ReceiveContent y representa los datos que recibe la Receive actividad o ReceiveReply . .NET Framework define dos clases relacionadas llamadas ReceiveMessageContent y ReceiveParametersContent ambas derivadas de ReceiveContent. Establezca la propiedad Receive de la actividad ReceiveReply o Content
en una instancia de uno de estos tipos para recibir datos en un servicio de flujo de trabajo. El tipo que se va a usar depende del tipo de datos que recibe la actividad. Si la actividad recibe un Message
objeto o un tipo de contrato de mensaje, use ReceiveMessageContent. Si la actividad recibe un conjunto de contrato de datos o tipos XML que se pueden serializar, use ReceiveParametersContent. ReceiveParametersContent permite enviar varios parámetros, mientras que ReceiveMessageContent solo permite enviar un objeto, el mensaje (o el tipo de contrato de mensaje).
Nota:
ReceiveMessageContent también se puede usar con un único contrato de datos o tipo XML que se puede serializar. La diferencia entre utilizar la clase ReceiveParametersContent con un parámetro único y el objeto pasado directamente a ReceiveMessageContent es el formato de conexión. El contenido del parámetro se ajusta en un elemento XML que corresponde al nombre de la operación y el objeto serializado se encapsula en un elemento XML con el nombre del parámetro (por ejemplo, <Echo><msg>Hello, World</msg></Echo>
). El contenido del mensaje no está encapsulado por el nombre de la operación. En su lugar, el objeto serializado se coloca dentro de un elemento XML mediante el nombre de tipo completo XML (por ejemplo, <string>Hello, World</string>
).
Las actividades Send y SendReply también tienen una propiedad denominada Content
. Esta propiedad es de tipo SendContent y representa los datos que envía la Send actividad o SendReply . .NET Framework define dos tipos relacionados denominados SendMessageContent y SendParametersContent ambos derivados de SendContent. Establezca la propiedad Send de la actividad SendReply o Content
en una instancia de uno de estos tipos para enviar datos de un servicio de flujo de trabajo. El tipo que se va a usar depende del tipo de datos que envía la actividad. Si la actividad envía un Message
objeto o un tipo de contrato de mensaje, use SendMessageContent. Si la actividad envía un tipo de contrato de datos, use SendParametersContent. SendParametersContent permite enviar varios parámetros, mientras que SendMessageContent solo permite enviar un objeto, el mensaje (o el tipo de contrato de mensaje).
Cuando programas de forma imperativa con las actividades de mensajería, utilizas el genérico InArgument<T> y OutArgument<T> para encapsular los objetos que asignas a las propiedades de mensaje o parámetros de las actividades Send, SendReply, Receive y ReceiveReply. Usa InArgument<T> para las actividades Send y SendReply y OutArgument<T> para las actividades Receive y ReceiveReply. Los argumentos In
se usan con las actividades de envío porque los datos se pasan a las actividades. Los argumentos Out
se usan con las actividades de recepción porque se pasan datos de las actividades, como se muestra en el ejemplo siguiente.
Receive reserveSeat = new Receive
{
...
Content = new ReceiveParametersContent
{
Parameters =
{
{ "ReservationInfo", new OutArgument<ReservationRequest>(reservationInfo) }
}
}
};
SendReply reserveSeat = new SendReply
{
...
Request = reserveSeat,
Content = new SendParametersContent
{
Parameters =
{
{ "ReservationId", new InArgument<string>(reservationId) }
}
},
};
Al implementar un servicio de flujo de trabajo que define una operación de solicitud/respuesta que devuelve void, debe crear una instancia de una actividad SendReply y establecer la propiedad Content en una instancia vacía de uno de los tipos de contenido (SendMessageContent o SendParametersContent), como se muestra en el ejemplo siguiente.
Receive rcv = new Receive()
{
ServiceContractName = "IService",
OperationName = "NullReturningContract",
Content = new ReceiveParametersContent( new Dictionary<string, OutArgument>() { { "message", new OutArgument<string>() } } )
};
SendReply sr = new SendReply()
{
Request = rcv
Content = new SendParametersContent();
};
Agregar referencia de servicio
Al llamar a un servicio de flujo de trabajo desde una aplicación de flujo de trabajo, Visual Studio 2012 genera actividades de mensajería personalizadas que encapsulan las actividades habituales Send y ReceiveReply usadas en un MEP de solicitud o respuesta. Para usar esta característica, haga clic con el botón derecho en el proyecto de cliente en Visual Studio y seleccione Agregar>referencia de servicio. Escriba la dirección base del servicio en el cuadro dirección y haga clic en Ir. Los servicios disponibles se muestran en el cuadro Servicios: Expanda el nodo de servicio para mostrar los contratos admitidos. Seleccione el contrato al que desea llamar y la lista de operaciones disponibles se muestra en el cuadro Operaciones . A continuación, puede especificar el espacio de nombres para la actividad generada y hacer clic en Aceptar. A continuación, verá un cuadro de diálogo que indica que la operación se completó correctamente y que las actividades personalizadas generadas se encuentran en el cuadro de herramientas después de volver a compilar el proyecto. Hay una actividad para cada operación definida en el contrato de servicio. Después de volver a generar el proyecto, puede arrastrar y colocar las actividades personalizadas en el flujo de trabajo y establecer las propiedades necesarias en la ventana de propiedades.
Plantillas de actividades de mensajería
Para facilitar la configuración de un MEP de solicitud y respuesta en el cliente y el servicio, Visual Studio 2012 proporciona dos plantillas de actividad de mensajería. System.ServiceModel.Activities.Design.ReceiveAndSendReply
se usa en el servicio y System.ServiceModel.Activities.Design.SendAndReceiveReply
se usa en el cliente. En ambos casos, las plantillas agregan las actividades de mensajería adecuadas al flujo de trabajo. En el servicio, System.ServiceModel.Activities.Design.ReceiveAndSendReply
agrega una actividad Receive seguida por una actividad SendReply. La propiedad Request se establece en la actividad Receive de forma automática. En el cliente, System.ServiceModel.Activities.Design.SendAndReceiveReply
agrega una actividad Send seguida de una ReceiveReply. La propiedad Request se establece en la actividad Send de forma automática. Para usar estas plantillas, basta con arrastrar y colocar la plantilla adecuada en el flujo de trabajo.
Actividades y transacciones de mensajería
Cuando se realiza una llamada a un servicio de flujo de trabajo, puede que desee transferir una transacción a la operación del servicio. Para ello, coloque la Receive actividad dentro de una TransactedReceiveScope actividad. La actividad TransactedReceiveScope contiene una actividad Receive
y un cuerpo. La transacción que ha fluido al servicio permanece ambiente a lo largo de la ejecución del cuerpo de TransactedReceiveScope. Se completa la transacción cuando el cuerpo termina de ejecutarse. Para obtener más información sobre los flujos de trabajo y las transacciones, consulte Transacciones de flujo de trabajo.