Compartir a través de


Habilitación del flujo de transacciones

Windows Communication Foundation (WCF) proporciona opciones muy flexibles para controlar el flujo de transacciones. La configuración del flujo de transacciones de un servicio se puede expresar mediante una combinación de atributos y configuración.

Configuración del flujo de transacciones

La configuración del flujo de transacción se genera para un punto de conexión de servicio como resultado de la intersección de los tres valores siguientes:

  • Atributo TransactionFlowAttribute especificado para cada método del contrato de servicio.

  • La propiedad de enlace TransactionFlow en el enlace concreto.

  • La propiedad de enlace TransactionFlowProtocol en el enlace concreto. La TransactionFlowProtocol propiedad de enlace permite elegir entre dos protocolos de transacción diferentes que puede usar para fluir una transacción. En las secciones siguientes se describe brevemente cada una de ellas.

Protocolo WS-AtomicTransaction

El protocolo WS-AtomicTransaction (WS-AT) es útil para escenarios en los que se requiere la interoperabilidad con pilas de protocolos de terceros.

Protocolo de OleTransactions

El protocolo OleTransactions es útil para escenarios en los que no se requiere la interoperabilidad con pilas de protocolos de terceros y el implementador de un servicio sabe de antemano que el servicio de protocolo WS-AT está deshabilitado localmente o la topología de red existente no favorece el uso de WS-AT.

En la tabla siguiente se muestran los distintos tipos de flujos de transacción que se pueden generar mediante estas diversas combinaciones.

TransactionFlow

vinculante
Propiedad de enlace TransactionFlow Protocolo de enlace TransactionFlowProtocol Tipo de flujo de transacción
Obligatorio cierto WS-AT La transacción debe fluir en el formato interoperable WS-AT.
Obligatorio cierto OleTransactions La transacción debe fluir en el formato OleTransactions de WCF.
Obligatorio falso No aplicable No es aplicable porque se trata de una configuración no válida.
Permitido cierto WS-AT La transacción puede fluir en el formato interoperable WS-AT.
Permitido cierto OleTransactions La transacción debe fluir en el formato OleTransactions WCF.
Permitido falso Cualquier valor No fluye una transacción.
NotAllowed (No permitido) Cualquier valor Cualquier valor No fluye una transacción.

En la tabla siguiente se resume el resultado del procesamiento de mensajes.

Mensaje entrante Configuración de TransactionFlow Encabezado de transacción Resultado del procesamiento de mensajes
La transacción coincide con el formato de protocolo esperado Permitido o obligatorio MustUnderstand es igual a true. Proceso
La transacción no coincide con el formato de protocolo esperado Obligatorio MustUnderstand es igual a false. Rechazado porque se requiere una transacción
La transacción no coincide con el formato de protocolo esperado Permitido MustUnderstand es igual a false. Rechazado porque no se entiende el encabezado
Transacción con cualquier formato de protocolo NotAllowed (No permitido) MustUnderstand es igual a false. Rechazado porque no se entiende el encabezado
Sin transacción Obligatorio No disponible Rechazado porque se requiere una transacción
Sin transacción Permitido No disponible Proceso
Sin transacción NotAllowed (No permitido) No disponible Proceso

Aunque cada método de un contrato puede tener requisitos de flujo de transacción diferentes, la configuración del protocolo de flujo de transacciones se limita al nivel del enlace. Esto significa que todos los métodos que comparten el mismo punto de conexión (y, por lo tanto, el mismo enlace) también comparten la misma directiva que permite o requiere flujo de transacción, así como el mismo protocolo de transacción si procede.

Habilitación del flujo de transacciones en el nivel de método

Los requisitos de flujo de transacciones no siempre son los mismos para todos los métodos de un contrato de servicio. Por lo tanto, WCF también proporciona un mecanismo basado en atributos para permitir que se expresen las preferencias de flujo de transacción de cada método. Esto se logra mediante el TransactionFlowAttribute que especifica el nivel en el que una operación de servicio acepta un encabezado de transacción. Debe marcar los métodos de contrato de servicio con este atributo si desea habilitar el flujo de transacciones. Este atributo toma uno de los valores de la TransactionFlowOption enumeración, en el que el valor predeterminado es NotAllowed. Si se especifica algún valor excepto NotAllowed , se requiere que el método no sea unidireccional. Un desarrollador puede usar este atributo para especificar restricciones o requisitos de flujo de transacciones de nivel de método en tiempo de diseño.

Habilitación del flujo de transacciones en el nivel de punto de conexión

Además de la configuración del flujo de transacciones de nivel de método que proporciona el TransactionFlowAttribute atributo, WCF proporciona una configuración de todo el punto de conexión para el flujo de transacciones para permitir a los administradores controlar el flujo de transacciones en un nivel superior.

Esto se logra mediante TransactionFlowBindingElement, que permite habilitar o deshabilitar el flujo de transacciones entrantes en la configuración de enlace de un punto de conexión, así como especificar el formato de protocolo de transacción deseado para las transacciones entrantes.

Si el enlace ha deshabilitado el flujo de transacciones, pero una de las operaciones de un contrato de servicio requiere una transacción entrante, se produce una excepción de validación al iniciar el servicio.

La mayoría de los enlaces permanentes que WCF proporciona contienen los transactionFlow atributos y transactionProtocol para permitirle configurar el enlace específico para aceptar transacciones entrantes. Para obtener más información sobre cómo establecer los elementos de configuración, consulte <vinculación>.

Un administrador o un implementador pueden usar el flujo de transacciones de nivel de punto de conexión para configurar restricciones o requisitos de flujo de transacción en el momento de la implementación mediante el archivo de configuración.

Seguridad

Para garantizar la seguridad e integridad del sistema, debe proteger los intercambios de mensajes al fluir las transacciones entre aplicaciones. No debe transmitir ni revelar los detalles de la transacción a ninguna aplicación que no tenga derecho a participar en la misma transacción.

Al generar clientes WCF en servicios web desconocidos o que no son de confianza mediante el uso de intercambio de metadatos, las llamadas a las operaciones de estos servicios web deben suprimir la transacción actual si es posible. En el ejemplo siguiente se muestra cómo hacerlo.

//client code which has an ambient transaction  
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))  
{  
    // No transaction will flow to this operation  
    untrustedProxy.Operation1(...);  
    scope.Complete();  
}  
//remainder of client code  

Además, los servicios deben configurarse para aceptar transacciones entrantes solo de los clientes que hayan autenticado y autorizado. Las transacciones entrantes solo deben aceptarse si proceden de clientes de alta confianza.

Aserciones de directiva

WCF usa aserciones de directiva para controlar el flujo de transacciones. Las aserciones de directiva se pueden encontrar en el documento de directiva de un servicio, que se genera mediante la agregación de contratos, configuración y atributos. El cliente puede obtener el documento de directiva del servicio mediante una solicitud GET de HTTP o una solicitud-respuesta WS-MetadataExchange. A continuación, los clientes pueden procesar el documento de directiva para determinar qué operaciones en un contrato de servicio pueden admitir o requerir flujo de transacciones.

Las aserciones de directiva de flujo de transacciones afectan al flujo de transacción especificando los encabezados SOAP que un cliente debe enviar a un servicio para representar una transacción. Todos los encabezados de transacción deben marcarse con MustUnderstand igual a true. Cualquier mensaje con un encabezado marcado de otra manera se rechaza con una falla de SOAP.

Solo una aserción de directiva relacionada con transacciones puede estar presente en una sola operación. WCF considera que los documentos de directiva con más de una aserción de transacción en una operación no son válidos y los rechaza. Además, solo puede haber un único protocolo de transacción dentro de cada tipo de puerto. Los documentos de directiva con operaciones que hacen referencia a más de un protocolo de transacción dentro de un único tipo de puerto se consideran no válidos y son rechazados por la Herramienta de Utilidad de Metadatos de ServiceModel (Svcutil.exe). Los documentos de directiva con aserciones de transacción presentes en los mensajes de salida o los mensajes de entrada unidireccionales también se consideran no válidos.