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