Se producen errores en las aplicaciones que combinan el flujo de transacciones y las llamadas remotas después de instalar los paquetes acumulativos de actualizaciones de calidad y seguridad de julio de 2018 de .NET Framework

Se aplica 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

Síntomas

Después de instalar los paquetes acumulativos de actualizaciones de calidad y seguridad de .NET Framework de julio de 2018 que se aplican a .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 y 4.7.2 en Windows 7 Service Pack 1 (SP1), Windows Server 2008 R2 SP1 o Windows Server 2008 SP2, observa errores en una aplicación de .NET Framework que cumple los siguientes criterios:

  • La aplicación usa instancias de la clase System.Transaction.TransactionScope en las que se habilita el flujo de transacciones pasando TransactionScopeAsyncFlowOption.Enabled al constructor.
  • La aplicación realiza una o más llamadas remotas mientras uno de estos ámbitos de transacción está activo. En este caso, una llamada remota es cualquier llamada que viaja a través de un proxy transparente antes de llegar al objeto de servidor. Entre los ejemplos de llamadas remotas se incluyen las llamadas a otros dominios de la aplicación y las llamadas realizadas a través de canales remotos, como los canales de cliente que se definen en los espacios de nombres System.Runtime.Remoting.Channels .
  • Después de la llamada remota, System.Transactions.Transaction.Current devuelve un valor nulo en lugar del valor devuelto antes de la llamada remota.

Solución alternativa

Para solucionar este problema, prueba cualquiera de los siguientes métodos:

  • Para cada ámbito de la transacción que habilita el flujo de transacciones, cambie la aplicación para asegurarse de que no se realicen llamadas remotas en ningún lugar del código que se ejecuta mientras el ámbito de la transacción está activo. Cuando determine si un ámbito de transacción contiene llamadas remotas, tenga en cuenta las siguientes directrices:

    • Una llamada a un método estático nunca es una llamada remota.
    • Para una llamada a un método de instancia en un objeto de destino, la llamada solo se realiza de forma remota si el objeto de destino es un proxy transparente.
    • Para una llamada a un constructor, la llamada se realiza de forma remota solo si el objeto construido es un proxy transparente.

    Nota Siempre puede usar el método System.Runtime.Remoting.RemotingServices.IsTransparentProxy para comprobar si un objeto es un proxy transparente.

  • Deshabilite el flujo de transacciones quitando el transactionScopeAsyncFlowOption.Enabled argumento constructor.

    Advertencia

    Es probable que esta solución alternativa cause otros errores si se ejecutan operaciones "en espera" mientras el ámbito de la transacción está activo.

  • La propiedad Transaction.Current no se serializa automáticamente a la llamada remota. Debe pasarse como parámetro. Si la llamada remota no pasa la transacción como un parámetro y no realiza una devolución de llamada al cliente durante la llamada remota, puede crear la llamada remota dentro de un nuevo TransactionScope objeto que utiliza el TransactionScopeOptions.Suppress opción. Dentro de este ámbito de supresión de la transacción, la propiedad Transaction.Current tiene un valor nulo.

Estado

Somos conscientes de este problema y actualmente estamos trabajando en una resolución.