Příznaky
Po instalaci kumulativní aktualizace zabezpečení a pro zvýšení kvality rozhraní .NET Framework z července 2018, které se vztahují na .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 a 4.7.2 v systému Windows 7 Service Pack 1 (SP1), Windows Server 2008 R2 SP1 nebo Windows Server 2008 SP2, si všimnete chyb v aplikaci rozhraní .NET Framework, která splňuje následující kritéria:
- Aplikace používá instance System.Transaction.TransactionScope třídy, ve které je povolen tok transakcí předáním TransactionScopeAsyncFlowOption.Enabled konstruktoru.
- Aplikace provede jedno nebo více vzdálených volání, když je jeden z těchto oborů transakcí aktivní. V tomto případě je vzdáleným voláním jakékoli volání, které prochází transparentním proxy serverem předtím, než dorazí k objektu serveru. Mezi příklady vzdálených volání patří volání jiných domén aplikace a volání provedená prostřednictvím kanálů pro vzdálenou komunikaci, jako jsou kanály klienta, které jsou definovány v System.Runtime.Remoting.Channels oborech názvů.
- Po vzdáleném volání System.Transactions.Transaction.Current vrátí hodnotu null místo hodnoty, která byla vrácena před vzdáleným voláním.
Alternativní řešení
Pokud chcete tento problém vyřešit, vyzkoušejte některou z následujících metod:
Pro každý obor transakce, který umožňuje tok transakce, změňte aplikaci tak, aby nikde v kódu, který je spuštěný, když je obor transakce aktivní, nedocházelo ke vzdáleným voláním. Při určování, jestli obor transakcí obsahuje nějaká vzdálená volání, zvažte následující pokyny:
- Volání statické metody není nikdy vzdálené volání.
- Pro volání metody instance na cílovém objektu je volání vzdálené pouze v případě, že cílový objekt je transparentní proxy server.
- Pro volání konstruktoru je volání vzdálené pouze v případě, že konstruovaný objekt je transparentní proxy server.
Poznámka Metodu můžete vždy použít System.Runtime.Remoting.RemotingServices.IsTransparentProxy ke kontrole, jestli je objekt transparentním proxy serverem.
Zakažte tok transakcí odebráním argumentu konstruktoru TransactionScopeAsyncFlowOption.Enabled .
Varování
Toto alternativní řešení pravděpodobně způsobí další chyby, pokud se některé operace "await" spustí v době, kdy je aktivní obor transakce.
Vlastnost Transaction.Current není automaticky serializována do vzdáleného volání. Musí se předat jako parametr. Pokud vzdálené volání neprojde transakcí jako parametr a během vzdáleného volání neprovede zpětné volání klientovi, můžete vzdálené volání vytvořit uvnitř nového objektu TransactionScope , který používá možnost TransactionScopeOptions.Suppress . V rámci tohoto oboru potlačit transakce má vlastnost Transaction.Current hodnotu null.
Stav
O tomto problému víme a momentálně pracujeme na řešení.