다음을 통해 공유


트랜잭션 흐름 활성화

WCF(Windows Communication Foundation)는 트랜잭션 흐름을 제어하기 위한 매우 유연한 옵션을 제공합니다. 서비스의 트랜잭션 흐름 설정은 특성과 구성의 조합을 사용하여 표현할 수 있습니다.

트랜잭션 흐름 설정

다음 세 값의 교집합 결과로 서비스 엔드포인트에 대한 트랜잭션 흐름 설정이 생성됩니다.

  • TransactionFlowAttribute 서비스 계약의 각 메서드에 대해 지정된 특성입니다.

  • TransactionFlow 특정 바인딩에 있는 바인딩 속성입니다.

  • TransactionFlowProtocol 특정 바인딩에 있는 바인딩 속성입니다. TransactionFlowProtocol 바인딩 속성을 사용하면 트랜잭션을 흐름하는 데 사용할 수 있는 두 가지 트랜잭션 프로토콜 중에서 선택할 수 있습니다. 다음 섹션에서는 각각에 대해 간략하게 설명합니다.

WS-AtomicTransaction 프로토콜

WS-AtomicTransaction(WS-AT) 프로토콜은 타사 프로토콜 스택과의 상호 운용성이 필요한 시나리오에 유용합니다.

OleTransactions 프로토콜

OleTransactions 프로토콜은 타사 프로토콜 스택과의 상호 운용성이 필요하지 않고 서비스의 배포자가 WS-AT 프로토콜 서비스가 로컬로 비활성화되거나 기존 네트워크 토폴로지에서 WS-AT 사용을 선호하지 않는다는 것을 미리 알고 있는 시나리오에 유용합니다.

다음 표에서는 이러한 다양한 조합을 사용하여 생성할 수 있는 다양한 유형의 트랜잭션 흐름을 보여 줍니다.

TransactionFlow

묶음
TransactionFlow 바인딩 속성 TransactionFlowProtocol 바인딩 프로토콜 트랜잭션 흐름의 유형
필수 맞다 WS-AT 트랜잭션은 상호 운용 가능한 WS-AT 형식으로 전달되어야 합니다.
필수 맞다 올레거래 트랜잭션은 WCF OleTransactions 형식으로 전달되어야 합니다.
필수 거짓 해당 없음 잘못된 구성이므로 해당되지 않습니다.
허용됨 맞다 WS-AT 트랜잭션은 상호 운용 가능한 WS-AT 형식으로 전달될 수 있습니다.
허용됨 맞다 올레거래 트랜잭션은 WCF OleTransactions 형식으로 전달될 수 있습니다.
허용됨 거짓 모든 값 트랜잭션이 흐르지 않습니다.
허용되지 않음 모든 값 모든 값 트랜잭션이 흐르지 않습니다.

다음 표에는 메시지 처리 결과가 요약되어 있습니다.

들어오는 메시지 TransactionFlow 설정 트랜잭션 헤더 메시지 처리 결과
트랜잭션이 예상 프로토콜 형식과 일치 허용 또는 필수 MustUnderstand같음 .true 프로세스
트랜잭션이 예상 프로토콜 형식과 일치하지 않음 필수 MustUnderstand같음 .false 트랜잭션이 필요하기 때문에 거부됨
트랜잭션이 예상 프로토콜 형식과 일치하지 않음 허용됨 MustUnderstand같음 .false 헤더가 이해되지 않아 거부됨
어떤 프로토콜 형식이든 사용하는 트랜잭션 허용되지 않음 MustUnderstand같음 .false 헤더가 이해되지 않아 거부됨
트랜잭션 없음 필수 해당 없음(N/A) 트랜잭션이 필요하기 때문에 거부됨
트랜잭션 없음 허용됨 해당 없음(N/A) 프로세스
트랜잭션 없음 허용되지 않음 해당 없음(N/A) 프로세스

계약의 각 메서드는 서로 다른 트랜잭션 흐름 요구 사항을 가질 수 있지만 트랜잭션 흐름 프로토콜 설정은 바인딩 수준에서 범위가 지정됩니다. 즉, 동일한 엔드포인트(따라서 동일한 바인딩)를 공유하는 모든 메서드는 트랜잭션 흐름을 허용하거나 요구하는 동일한 정책뿐만 아니라 해당하는 경우 동일한 트랜잭션 프로토콜도 공유합니다.

메서드 수준에서 트랜잭션 흐름 사용

트랜잭션 흐름 요구 사항이 서비스 계약의 모든 메서드에 대해 항상 동일하지는 않습니다. 따라서 WCF는 각 메서드의 트랜잭션 흐름 기본 설정을 표현할 수 있도록 특성 기반 메커니즘도 제공합니다. 이는 서비스 작업에서 트랜잭션 헤더를 허용하는 수준을 지정하는 방식으로 수행 TransactionFlowAttribute 됩니다. 트랜잭션 흐름을 사용하도록 설정하려면 서비스 계약 메서드를 이 특성으로 표시해야 합니다. 이 특성은 기본값이 TransactionFlowOption 있는 열거형의 값 NotAllowed중 하나를 사용합니다. NotAllowed를 제외한 어떤 값이라도 지정되면 메서드는 단방향이 아니어야 합니다. 개발자는 이 특성을 사용하여 디자인 타임에 메서드 수준 트랜잭션 흐름 요구 사항 또는 제약 조건을 지정할 수 있습니다.

엔드포인트 수준에서 트랜잭션 흐름 사용

특성이 제공하는 메서드 수준 트랜잭션 흐름 설정 TransactionFlowAttribute 외에도 WCF는 관리자가 더 높은 수준에서 트랜잭션 흐름을 제어할 수 있도록 트랜잭션 흐름에 대한 엔드포인트 수준 설정을 제공합니다.

이를 통해 TransactionFlowBindingElement엔드포인트의 바인딩 설정에서 들어오는 트랜잭션 흐름을 사용하거나 사용하지 않도록 설정하고 들어오는 트랜잭션에 대해 원하는 트랜잭션 프로토콜 형식을 지정할 수 있습니다.

바인딩이 트랜잭션 흐름을 비활성화했지만, 서비스 계약의 작업 중 하나가 들어오는 트랜잭션을 필요로 하는 경우, 서비스 시작 시 유효성 검사 예외가 발생합니다.

WCF에서 제공하는 대부분의 고정 바인딩에는 transactionFlowtransactionProtocol 특성이 포함되어 있어, 들어오는 트랜잭션을 수락하기 위해 특정 바인딩을 구성할 수 있습니다. 구성 요소 설정에 대한 자세한 내용은 바인딩<을 참조하세요>.

관리자 또는 배포자는 엔드포인트 수준 트랜잭션 흐름을 사용하여 구성 파일을 사용하여 배포 시 트랜잭션 흐름 요구 사항 또는 제약 조건을 구성할 수 있습니다.

안전

시스템 보안 및 무결성을 보장하려면 애플리케이션 간에 트랜잭션을 전송할 때 메시지 교환을 보호해야 합니다. 동일한 트랜잭션에 참여할 자격이 없는 애플리케이션에 트랜잭션 세부 정보를 전달하거나 공개해서는 안 됩니다.

메타데이터 교환을 사용하여 알 수 없거나 신뢰할 수 없는 웹 서비스에 WCF 클라이언트를 생성하는 경우 이러한 웹 서비스에 대한 작업에 대한 호출은 가능하면 현재 트랜잭션을 표시하지 않아야 합니다. 다음 예제에서는 이 작업을 수행하는 방법을 보여 줍니다.

//client code which has an ambient transaction  
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))  
{  
    // No transaction will flow to this operation  
    untrustedProxy.Operation1(...);  
    scope.Complete();  
}  
//remainder of client code  

또한 인증 및 권한이 부여된 클라이언트에서만 들어오는 트랜잭션을 허용하도록 서비스를 구성해야 합니다. 들어오는 트랜잭션은 신뢰할 수 있는 클라이언트에서 온 경우에만 수락해야 합니다.

정책 주장

WCF는 정책 어설션을 사용하여 트랜잭션 흐름을 제어합니다. 정책 어설션은 계약, 구성 및 특성을 집계하여 생성되는 서비스의 정책 문서에서 찾을 수 있습니다. 클라이언트는 HTTP GET 또는 WS-MetadataExchange 요청-회신을 사용하여 서비스의 정책 문서를 가져올 수 있습니다. 그런 다음 클라이언트는 정책 문서를 처리하여 서비스 계약에 대한 작업이 트랜잭션 흐름을 지원하거나 요구할 수 있는지 확인할 수 있습니다.

트랜잭션 흐름 정책 어설션은 클라이언트가 트랜잭션을 나타내기 위해 서비스에 보내야 하는 SOAP 헤더를 지정하여 트랜잭션 흐름에 영향을 줍니다. 모든 트랜잭션 헤더는 MustUnderstandtrue로 표시되어야 합니다. 그렇지 않은 경우 헤더가 표시된 메시지는 SOAP 오류로 거부됩니다.

단일 작업에는 트랜잭션 관련 정책 어설션이 하나만 있을 수 있습니다. 작업에서 트랜잭션 어설션이 두 개 이상 있는 정책 문서는 잘못된 것으로 간주되며 WCF에서 거부됩니다. 또한 각 포트 형식 내에는 단일 트랜잭션 프로토콜만 있을 수 있습니다. 단일 포트 형식 내에서 둘 이상의 트랜잭션 프로토콜을 참조하는 작업이 있는 정책 문서는 잘못된 것으로 간주되며 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe)에서 거부됩니다. 출력 메시지 또는 단방향 입력 메시지에 트랜잭션 어설션이 있는 정책 문서도 잘못된 것으로 간주됩니다.