Sintomas
Depois de instalar os Pacotes cumulativos de segurança do .NET Framework de julho de 2018 que se aplicam ao .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 e 4.7.2 no Windows 7 Service Pack 1 (SP1), Windows Server 2008 R2 SP1 ou Windows Server 2008 SP2, você percebe erros em aplicativos do .NET Framework que atendem aos seguintes critérios:
-
O aplicativo usa instâncias da classe System.Transaction.TransactionScope em que o fluxo de transações está habilitado, transmitindo TransactionScopeAsyncFlowOption.Enabled ao construtor.
-
O aplicativo faz uma ou mais chamadas remotas enquanto um desses escopos de transação está ativo. Nesse caso, uma chamada remota é qualquer chamada que viaja através de um proxy transparente antes de chegar ao objeto de servidor. Chamadas para outros domínios de aplicativo e chamadas feitas através de canais de comunicação remota, como os canais de comunicação remota, como os canais de cliente definidos nos namespaces System.Runtime.Remoting.Channels.
-
Após a chamada remota, System.Transactions.Transaction.Current retorna um valor nulo em vez do valor que foi retornado antes da chamada remota.
Solução alternativa
Para contornar esse problema, tente um dos seguintes métodos:
-
Para cada escopo de transação que permite o fluxo de transações, altere o aplicativo para certificar-se de que nenhuma chamada remota ocorra em qualquer lugar no código que é executado enquanto o escopo da transação está ativo. Ao determinar se um escopo de transação contém chamadas remotas, considere as seguintes diretrizes:
-
Uma chamada para um método estático nunca é uma chamada remota.
-
Para uma chamada para um método de instância em um objeto de destino, a chamada será remota somente se o objeto de destino for um proxy transparente.
-
Para uma chamada para um construtor, a chamada será remota somente se o objeto construído for um proxy transparente.
Observação Você sempre pode usar o método System.Runtime.Remoting.RemotingServices.IsTransparentProxy para verificar se um objeto é um proxy transparente.
-
-
Desabilite o fluxo de transações removendo o argumento do construtor TransactionScopeAsyncFlowOption.Enabled.
Aviso
Essa solução alternativa provavelmente causará outros erros se qualquer operação para "aguardar" for executada enquanto o escopo da transação estiver ativo.
-
A propriedade Transaction.Current não é serializada automaticamente para a chamada remota. Ela deve ser passada como um parâmetro. Se a chamada remota não passar a transação como um parâmetro e não fizer um retorno de chamada para o cliente durante a chamada remota, você poderá criar a chamada remota dentro de um novo objeto TransactionScope que use a opção TransactionScopeOptions.Suppress. Dentro desse escopo de transação de supressão, a propriedade Transaction.Current tem um valor nulo.
Status
Estamos cientes desse problema e estamos trabalhando atualmente em uma resolução.