2018년 7월 .NET Framework 보안 및 품질 롤업이 설치된 후 트랜잭션 흐름과 원격 호출을 결합하는 애플리케이션에서 오류가 발생합니다.

적용 대상
.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

증상

.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 값이 있습니다.

상태

우리는이 문제를 알고 있으며 현재 해결을 위해 노력하고 있습니다.