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.TransactionChannel1.WriteTransactionToMessage(Message message, TransactionFlowOption txFlowOption) at System.ServiceModel.Channels.TransactionChannel1.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
TransactionInteropclase - Todas las variaciones del
Transaction.EnlistDurablemétodo Transaction.EnlistPromotableSinglePhaseTransaction.PromoteAndEnlistDurable- Acceso al
TransactionManager.DistributedTransactionStartedevento - Acceso a la
TransactionManager.HostCurrentCallbackpropiedad - Uso de
TransactionManager.ReenlistyTransactionManager.RecoveryComplete - Uso de la
TransactionScopeclase cuando se especificaEnterpriseServicesInteropOptionuna
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.