Fehler treten in Anwendungen auf, die Transaktionsfluss und Remoteaufrufe kombinieren, nachdem im Juli 2018 .NET Framework Sicherheits- und Qualitätsrollups installiert wurden

Gilt für
.NET Framework 4.7.2 .NET Framework 4.7.1 .NET Framework 4.7 .NET Framework 4.6 .NET Framework 4.6.1 .NET Framework 4.6.2

Symptome

Nach der Installation der .NET Framework Sicherheits- und Qualitätsrollups vom Juli 2018, die für .NET Framework 4.6 gelten, 4.6.1, 4.6.2, 4.7, 4.7.1 und 4.7.2 unter Windows 7 Service Pack 1 (SP1), Windows Server 2008 R2 SP1 oder Windows Server 2008 SP2 werden Fehler in einem .NET Framework Anwendung, die die folgenden Kriterien erfüllt:

  • Die Anwendung verwendet Instanzen der System.Transaction.TransactionScope-Klasse , in denen der Transaktionsfluss aktiviert ist, indem TransactionScopeAsyncFlowOption.Enabled an den Konstruktor übergeben wird.
  • Die Anwendung führt einen oder mehrere Remoteaufrufe aus, während einer dieser Transaktionsbereiche aktiv ist. In diesem Fall ist ein Remoteaufruf jeder Aufruf, der über einen transparenten Proxy geleitet wird, bevor er das Serverobjekt erreicht. Beispiele für Remoteaufrufe sind Aufrufe an andere Anwendungsdomänen und Aufrufe über Remotingkanäle, z. B. die Clientkanäle, die in den System.Runtime.Remoting.Channels-Namespaces definiert sind.
  • Nach dem Remoteaufruf gibt System.Transactions.Transaction.Current anstelle des Werts, der vor dem Remoteaufruf zurückgegeben wurde, einen NULL-Wert zurück.

Problemumgehung

Um dieses Problem zu umgehen, probieren Sie eine der folgenden Methoden aus:

  • Ändern Sie für jeden Transaktionsbereich, der den Transaktionsfluss ermöglicht, die Anwendung, um sicherzustellen, dass keine Remoteaufrufe im Code stattfinden, der ausgeführt wird, während der Transaktionsbereich aktiv ist. Wenn Sie bestimmen, ob ein Transaktionsbereich Remoteaufrufe enthält, beachten Sie die folgenden Richtlinien:

    • Ein Aufruf einer statischen Methode ist nie ein Remoteaufruf.
    • Bei einem Aufruf einer instance-Methode für ein Zielobjekt erfolgt der Aufruf nur dann remote, wenn das Zielobjekt ein transparenter Proxy ist.
    • Bei einem Aufruf eines Konstruktors erfolgt der Aufruf nur dann remote, wenn das konstruierte Objekt ein transparenter Proxy ist.

    Hinweis Sie können jederzeit die System.Runtime.Remoting.RemotingServices.IsTransparentProxy-Methode verwenden, um zu überprüfen, ob ein Objekt ein transparenter Proxy ist.

  • Deaktivieren Sie den Transaktionsfluss, indem Sie das Konstruktorargument TransactionScopeAsyncFlowOption.Enabled entfernen.

    Warnung

    Diese Problemumgehung verursacht wahrscheinlich andere Fehler, wenn "await"-Vorgänge ausgeführt werden, während der Transaktionsbereich aktiv ist.

  • Die Transaction.Current-Eigenschaft wird nicht automatisch in den Remoteaufruf serialisiert. Sie muss als Parameter übergeben werden. Wenn der Remoteaufruf die Transaktion nicht als Parameter übergibt und während des Remoteaufrufs keinen Rückruf an den Client durchführt, können Sie den Remoteaufruf in einem neuen TransactionScope-Objekt erstellen, das die Option TransactionScopeOptions.Suppress verwendet. Innerhalb dieses Unterdrückungstransaktionsbereichs weist die Transaction.Current-Eigenschaft einen NULL-Wert auf.

Status

Wir sind uns dieses Problems bewusst und arbeiten derzeit an einer Lösung.