La transacción MSDTC requiere plena confianza y no se puede ejecutar en una solución de espacio aislado

Este artículo le ayuda a resolver el problema en el que una transacción del Coordinador de transacciones distribuidas de Microsoft (MSDTC) requiere plena confianza y no puede ejecutarse en una solución de espacio aislado.

Versión del producto original:   .NET Framework 4.5
Número KB original:   2998281

Síntomas

Suponga que está ejecutando una aplicación en modo de espacio aislado (o simplemente ejecutando una aplicación sin .NET Full Trust). Al probar operaciones dentro de las que requieren acceso a un coordinador de transacciones distribuidas System.Transactions (normalmente MSDTC), se cumple la excepción siguiente:

System.Security.SecurityException: Error en la solicitud.

El seguimiento de la pila de servidores es el siguiente:

en System.ServiceModel.Transactions.OleTxTransactionFormatter.WriteTransaction(Transaction transaction, Message message)
en System.ServiceModel.Channels.TransactionChannel 1.WriteTransactionToMessage(Message message, TransactionFlowOption txFlowOption) at System.ServiceModel.Channels.TransactionChannel 1.WriteTransactionDataToMessage(Message message, MessageDirection direction)
en System.ServiceModel.Channels.TransactionDuplexChannelGeneric'1.Send(Message message, TimeSpan timeout)
en System.ServiceModel.Dispatcher.DuplexChannelBinder.Request(Message message, TimeSpan timeout)
en System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
en System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
en System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) en System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Causa

Este comportamiento es una característica del diseño de la aplicación. Ciertas operaciones dentro System.Transactions requieren plena confianza porque requieren acceso a servicios con privilegios. Sin plena confianza, estas operaciones no se pueden ejecutar. Las siguientes operaciones lo requieren actualmente:

  • Todos los métodos de la TransactionInterop clase
  • Todas las variaciones del Transaction.EnlistDurable método
  • Transaction.EnlistPromotableSinglePhase
  • Transaction.PromoteAndEnlistDurable
  • Acceso al TransactionManager.DistributedTransactionStarted evento
  • Acceso a la TransactionManager.HostCurrentCallback propiedad
  • Uso de TransactionManager.Reenlist y TransactionManager.RecoveryComplete
  • Uso de la TransactionScope clase cuando se especifica EnterpriseServicesInteropOption una

Solución alternativa

Para evitar este comportamiento, ejecute la aplicación con plena confianza o cree un proxy de ensamblado de caché global de ensamblados (GAC) que acepte autores de llamadas de confianza parcial y, a continuación, llame a este ensamblado desde la aplicación de espacio aislado.

Referencias

Clase AllowPartiallyTrustedCallersAttribute