Freigeben über


MSDTC-Transaktion erfordert voll vertrauenswürdig und kann nicht in einer Sandkastenlösung ausgeführt werden.

Dieser Artikel hilft Ihnen, das Problem zu beheben, bei dem eine Microsoft Distributed Transaction Coordinator (MSDTC)-Transaktion voll vertrauenswürdig ist und nicht in einer Sandkastenlösung ausgeführt werden kann.

Originalproduktversion: .NET Framework 4.5
Ursprüngliche KB-Nummer: 2998281

Symptome

Gehen Sie davon aus, dass Sie eine Anwendung im Sandkastenmodus ausführen (oder einfach eine Anwendung ohne .NET Full Trust ausführen). Wenn Sie Vorgänge ausprobieren, die System.Transactions Zugriff auf einen verteilten Transaktionskoordinator (in der Regel MSDTC) erfordern, erfüllen Sie die folgende Ausnahme:

System.Security.SecurityException: Anforderung fehlgeschlagen.

Die Serverstapelablaufverfolgung lautet wie folgt:

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

Ursache

Dieses Verhalten ist beabsichtigt. Bestimmte Vorgänge innerhalb von System.Transactions "Voll vertrauenswürdig" erfordern, da sie Zugriff auf privilegierte Dienste erfordern. Ohne voll vertrauenswürdige Vorgänge können diese Vorgänge nicht ausgeführt werden. Für die folgenden Vorgänge ist dies derzeit erforderlich:

  • Alle Methoden für die TransactionInterop Klasse
  • Alle Variationen der Transaction.EnlistDurable Methode
  • Transaction.EnlistPromotableSinglePhase
  • Transaction.PromoteAndEnlistDurable
  • Zugriff auf das TransactionManager.DistributedTransactionStarted Ereignis
  • Zugriff auf die TransactionManager.HostCurrentCallback Eigenschaft
  • Nutzung und TransactionManager.ReenlistTransactionManager.RecoveryComplete
  • Verwendung der TransactionScope Klasse, wenn ein EnterpriseServicesInteropOption Wert angegeben wird

Zwischenlösung

Um dieses Verhalten zu umgehen, führen Sie die Anwendung mit "Voll vertrauenswürdig" aus, oder erstellen Sie einen GAC-Assemblyproxy (Global Assembly Cache), der teilweise vertrauenswürdige Aufrufer akzeptiert, und rufen Sie diese Assembly dann aus der Sandkastenanwendung auf.

Verweise

AllowPartiallyTrustedCallersAttribute-Klasse