Ocorrem erros em aplicativos que combinam fluxo de transações e chamadas remotas após a instalação dos Pacotes Cumulativos de Segurança e Qualidade do .NET Framework de julho de 2018

Aplica-se a
.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

Sintomas

Depois de instalar os Pacotes Cumulativos de Segurança e Qualidade 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), no Windows Server 2008 R2 SP1 ou no Windows Server 2008 SP2, você percebe erros em um .NET Framework aplicativo que atenda aos seguintes critérios:

  • O aplicativo usa instâncias da classe System.Transaction.TransactionScope na qual o fluxo de transações é habilitado passando TransactionScopeAsyncFlowOption.Enabled para o 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 passa por um proxy transparente antes de atingir o objeto do servidor. Exemplos de chamadas remotas incluem chamadas para outros domínios de aplicativo e chamadas feitas por meio de 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

Como solução alternativa para 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 garantir que nenhuma chamada remota ocorra em qualquer lugar no código executado enquanto o escopo da transação estiver 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 marcar se um objeto é um proxy transparente.

  • Desabilite o fluxo de transações removendo o argumento do construtor TransactionScopeAsyncFlowOption.Enabled .

    Aviso

    É provável que essa solução alternativa cause outros erros se qualquer operação de "espera" for executada enquanto o escopo da transação estiver ativo.

  • A propriedade Transaction.Current não é serializada automaticamente para a chamada remota. Ele deve ser passado 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 usa 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 em uma solução.