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" erfordert und nicht in einer Sandkastenlösung ausgeführt werden kann.

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

Problembeschreibung

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 System.Transactions ausprobieren, die Zugriff auf einen verteilten Transaktions-Coordinator erfordern (in der Regel MSDTC), erfüllen Sie die folgende Ausnahme:

System.Security.SecurityException: Anforderung fehlgeschlagen.

Die Serverstapelüberwachung sieht wie folgt aus:

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

Ursache

Es handelt sich hierbei um ein beabsichtigtes Verhalten. Bestimmte Vorgänge System.Transactions innerhalb erfordern Voll vertrauenswürdig, da sie Zugriff auf privilegierte Dienste benötigen. Ohne Voll vertrauenswürdig können diese Vorgänge nicht ausgeführt werden. Für die folgenden Vorgänge ist dies derzeit erforderlich:

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

Problemumgehung

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

References

AllowPartiallyTrustedCallersAttribute-Klasse