2011-03-18 29 views

Respuesta

7

Sí, funciona. Fluimos transacciones a través de WCF, llamamos a los componentes COM + transaccionales del proceso y pasamos manualmente las transacciones de un servicio web .NET 2.0 asmx a un servicio WCF.

Ahora, eso no quiere decir que la configuración no sea delicada. Creo que la mayoría de los problemas estaban relacionados con la instalación correcta de MSDTC en todos los servidores.

ACTUALIZACIÓN

No utilizamos DependentClone. Estamos pasando la transacción como una matriz de bytes usando GetTransactionFromTransmitterPropagationToken. Muy similar al segundo ejemplo de Propagating a Transaction Across AppDomains.

A modo de ejemplo:

Cliente:

public void CallOutOfProcessAndPassTransaction 
{ 
    Client client = new Client(); 

    client.DoSomethingTransactional(
     System.Transactions.TransactionInterop.GetTransmitterPropagationToken(
      System.Transactions.Transaction.Current) 
    ); 
} 

Servicio:

public void DoSomethingTransactional(byte[] tx) 
{ 
    using (TransactionScope ts = new TransactionScope(
       TransactionInterop.GetTransactionFromTransmitterPropagationToken(tx))) 
    { 
     // Do Something 

     // vote to commit the transaction if the caller also agrees 
     ts.Complete(); 
    } 
} 
+0

¿Podría por favor contar más sobre el proceso de pasar la transacción a otro AppDomain? ¿Crea un clon llamando a currentTransaction.DependentClone y lo pasa o simplemente pasa la transacción actual? – SiberianGuy

+0

¿Y qué hay de cometer tal transacción? ¿Supongo que puedo comprometerlo solo desde AppDomain inicial? – SiberianGuy

+0

@ldsa: cuando transfiere una transacción a través de un dominio de aplicación, se ocupará de una transacción distribuida. Para comprometer la transacción, todos los participantes deberán votar para comprometerse. p.ej. appdomain1 y appdomain2 ambos tendrán que confirmar. –

0

encontré problemas con este tipo de solución. En mi caso, estaba trabajando en el padre y en varios hijos. Para que funcione, tuve que usar TransactionScope solo en el padre. Mi propia pregunta/respuesta está en Using transactions across processes.