증상
.NET Framework 4.6에 적용되는 2018년 7월 .NET Framework 보안 및 품질 롤업을 설치한 후 4.6.1, 4.6.2, 4.7, 4.7.1 및 4.7.2(Windows 7 SP1), Windows Server 2008 R2 SP1 또는 Windows Server 2008 SP2의 경우 .NET Framework 다음 조건을 충족하는 애플리케이션:
- 애플리케이션은 TransactionScopeAsyncFlowOption.Enabled를 생성자에 전달하여 트랜잭션 흐름을 사용하도록 설정하는 System.Transaction.TransactionScope 클래스의 인스턴스를 사용합니다.
- 애플리케이션은 이러한 트랜잭션 범위 중 하나가 활성 상태인 동안 하나 이상의 원격 호출을 만듭니다. 이 경우 원격 호출은 서버 개체에 도달하기 전에 투명 프록시를 통해 이동하는 모든 호출입니다. 원격 호출의 예로는 System.Runtime.Remoting.Channels 네임스페이스에 정의된 클라이언트 채널과 같이 원격 채널을 통해 수행되는 다른 애플리케이션 도메인에 대한 호출 및 호출이 있습니다.
- 원격 호출 후 System.Transactions.Transaction.Current 는 원격 호출 전에 반환된 값 대신 null 값을 반환합니다.
해결 방법
이 문제를 해결하려면 다음 방법 중 일부를 시도해 보세요.
트랜잭션 흐름을 사용하도록 설정하는 각 트랜잭션 scope 대해 애플리케이션을 변경하여 트랜잭션 scope 활성 상태인 동안 실행되는 코드에서 원격 호출이 발생하지 않도록 합니다. 트랜잭션 scope 원격 호출이 포함되어 있는지 여부를 확인하는 경우 다음 지침을 고려합니다.
- 정적 메서드에 대한 호출은 원격 호출이 아닌 경우
- 대상 개체에서 instance 메서드를 호출하는 경우 대상 개체가 투명한 프록시인 경우에만 호출이 원격입니다.
- 생성자에 대한 호출의 경우 생성된 개체가 투명한 프록시인 경우에만 호출이 원격입니다.
참고 항상 System.Runtime.Remoting.RemotingServices.IsTransparentProxy 메서드를 사용하여 개체가 투명한 프록시인지 여부를 검사 수 있습니다.
TransactionScopeAsyncFlowOption.Enabled 생성자 인수를 제거하여 트랜잭션 흐름을 사용하지 않도록 설정합니다.
경고
이 해결 방법은 트랜잭션 scope 활성 상태인 동안 "await" 작업이 실행되는 경우 다른 오류가 발생할 수 있습니다.
Transaction.Current 속성은 원격 호출에 자동으로 직렬화되지 않습니다. 매개 변수로 전달되어야 합니다. 원격 호출이 트랜잭션을 매개 변수로 전달하지 않고 원격 호출 중에 클라이언트에 콜백을 수행하지 않는 경우 TransactionScopeOptions.Suppress 옵션을 사용하는 새 TransactionScope 개체 내에서 원격 호출을 만들 수 있습니다. 트랜잭션 scope 이 표시 안 함 내에서 Transaction.Current 속성에는 null 값이 있습니다.
상태
우리는이 문제를 알고 있으며 현재 해결을 위해 노력하고 있습니다.