Síntomas
Después de instalar el paquete acumulativo de actualizaciones de calidad y seguridad de julio de 2018 para .NET Framework, que se aplica a .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 y 4.7.2 para Windows 7 Service Pack 1 (SP1), Windows Server 2008 R2 SP1 o Windows Server 2008 SP2, detectará errores en las aplicaciones de .NET Framework que cumplan los siguientes criterios:
-
La aplicación utiliza instancias de la clase System.Transaction.TransactionScope en las que el flujo de transacción se habilita mediante el paso de 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 viaje a través de un proxy transparente antes de alcanzar el objeto servidor. Algunos ejemplos de llamadas remotas son las llamadas a otros dominios de aplicación y las realizadas a través de canales remotos, como los canales de cliente definidos en los espacios de nombres System.Runtime.Remoting.Channels.
-
Después de la llamada remota, System.Transactions.Transaction.Current devuelve un valor nulo en vez del valor que devolvía antes de la llamada remota.
Solución alternativa
Para evitar este problema, pruebe cualquiera de los métodos siguientes.
-
Para cada ámbito de transacción que habilite flujo de transacciones, cambie la aplicación para asegurarse de que no se producen llamadas remotas en ninguna parte del código que se ejecute mientras el ámbito de transacción está activo. A la hora de determinar si un ámbito de transacción contiene alguna llamada remota, tenga en cuenta las siguientes directrices:
-
Una llamada a un método estático no es nunca una llamada remota.
-
En el caso de una llamada a un método de instancia en un objeto de destino, la llamada es remota solo si el objeto de destino es un proxy transparente.
-
En el caso de una llamada a un constructor, la llamada es remota solo si el objeto construido es un proxy transparente.
Nota Siempre puede utilizar el método System.Runtime.Remoting.RemotingServices.IsTransparentProxy para comprobar si un objeto es un proxy transparente.
-
-
Deshabilite el flujo de transacción eliminando el argumento TransactionScopeAsyncFlowOption.Enabled del constructor.
Advertencia
Es probable que esta solución alternativa cause otros errores si se ejecuta cualquier operación "await" mientras el ámbito de transacción está activo.
-
La propiedad Transaction.Current no se serializa automáticamente para la llamada remota. Debe pasarse como un 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, puede crear la llamada remota dentro de un nuevo objeto TransactionScope que utilice la opción TransactionScopeOptions.Suppress. Dentro de este ámbito de transacción Suppress, la propiedad Transaction.Current tiene valor nulo.
Estado
Somos conscientes de este problema y estamos trabajando para solucionarlo.