Ocorrem erros em aplicações que combinam fluxo de transações e chamadas remotas após a instalação dos Rollups de Segurança e Qualidade de .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 Rollups de Segurança e Qualidade do .NET Framework de julho de 2018 aplicáveis 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, irá detetar erros num .NET Framework candidatura que cumpra os seguintes critérios:

  • O aplicativo usa instâncias da classe System.Transaction.TransactionScope na qual o fluxo de transação é habilitado passando TransactionScopeAsyncFlowOption.Enabled para o construtor.
  • O aplicativo faz uma ou mais chamadas remotas enquanto um desses escopos de transação está ativo. Neste caso, uma chamada remota é qualquer chamada que percorre um proxy transparente antes de chegar ao objeto do servidor. Exemplos de chamadas remotas incluem chamadas para outros domínios de aplicativo e chamadas feitas por meio de canais remotos, como os canais cliente definidos nos namespaces System.Runtime.Remoting.Channels .
  • Após a chamada remota, System.Transactions.Transaction.Current devolve um valor nulo em vez do valor que foi devolvido antes da chamada remota.

Solução alternativa

Para contornar este problema, experimente um dos seguintes métodos:

  • Para cada escopo de transação que permite o fluxo de transação, altere o aplicativo para garantir que nenhuma chamada remota ocorra em qualquer lugar no código que é executado enquanto o escopo de transação está ativo. Ao determinar se o escopo de uma 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 é remota somente se o objeto de destino for um proxy transparente.
    • Para uma chamada para um construtor, a chamada é 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.

  • Desative o fluxo de transação removendo o argumento do construtor TransactionScopeAsyncFlowOption.Enabled .

    Aviso

    É provável que esta solução alternativa cause outros erros se quaisquer operações "aguardam" executadas enquanto o âmbito 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 supressão de transação, a propriedade Transaction.Current tem um valor nulo.

Status

Temos conhecimento deste problema e estamos atualmente a trabalhar numa resolução.