Symptomen
Nadat u de juli 2018 updatepakketten voor beveiliging en kwaliteit van .NET Framework (.NET Framework) hebt geïnstalleerd die van toepassing zijn op .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 en 4.7.2 op Windows 7 Service Pack 1 (SP1), Windows Server 2008 R2 SP1 of Windows Server 2008 SP2, ziet u fouten in een .NET Framework Toepassing die voldoet aan de volgende criteria:
- De toepassing maakt gebruik van exemplaren van de klasse System.Transaction.TransactionScope , waarin de transactiestroom wordt ingeschakeld door TransactionScopeAsyncFlowOption.Enabled door te geven aan de constructor.
- De toepassing voert een of meer externe aanroepen uit terwijl een van deze transactiebereiken actief is. In dit geval is een externe oproep een oproep die door een transparante proxy gaat voordat deze het serverobject bereikt. Voorbeelden van externe aanroepen zijn oproepen naar andere toepassingsdomeinen en oproepen die worden gedaan via externe kanalen, zoals de clientkanalen die zijn gedefinieerd in de naamruimten System.Runtime.Remoting.Channels .
- Na de externe aanroep retourneert System.Transactions.Transaction.Current een null-waarde in plaats van de waarde die werd geretourneerd vóór de externe aanroep.
Tijdelijke oplossing
Om dit probleem te omzeilen, probeert u een van de volgende methoden:
Voor elk transactiebereik dat een transactiestroom mogelijk maakt, moet u de toepassing wijzigen om ervoor te zorgen dat er nergens in de code die wordt uitgevoerd terwijl het transactiebereik actief is, geen externe aanroepen plaatsvinden. Wanneer u bepaalt of een transactiebereik externe oproepen bevat, moet u rekening houden met de volgende richtlijnen:
- Een oproep naar een statische methode is nooit een oproep op afstand.
- Bij een aanroep naar een instantiemethode op een doelobject vindt de aanroep alleen op afstand plaats als het doelobject een transparante proxy is.
- Voor een aanroep naar een constructor is de aanroep alleen extern als het geconstrueerde object een transparante proxy is.
Notitie U kunt altijd de methode System.Runtime.Remoting.RemotingServices.IsTransparentProxy gebruiken om te controleren of een object een transparante proxy is.
Schakel de transactiestroom uit door het constructorargument TransactionScopeAsyncFlowOption.Enabled te verwijderen.
Waarschuwing
Deze tijdelijke oplossing veroorzaakt waarschijnlijk andere fouten als 'wachtende' bewerkingen worden uitgevoerd terwijl het transactiebereik actief is.
De eigenschap Transaction.Current wordt niet automatisch geserialiseerd voor de externe aanroep. Deze moet worden doorgegeven als een parameter. Als met de externe aanroep de transactie niet als parameter wordt doorgegeven en de client tijdens de externe aanroep niet wordt teruggebeld, kunt u de externe aanroep maken in een nieuw TransactionScope-object dat gebruikmaakt van de optie TransactionScopeOptions.Suppress . Binnen dit bereik voor het onderdrukken van transacties heeft de eigenschap Transaction.Current een null-waarde.
Status
We zijn op de hoogte van dit probleem en werken momenteel aan een oplossing.