TransactionScope 내부에서 netMsmqBinding을 사용하여 WCF 호출 중 트랜잭션 중지
-
19-09-2019 - |
문제
MSMQ를 통해 작동하는 WCF 로깅 서비스가 있습니다.항목은 Sql Server 2005 데이터베이스에 기록됩니다.TransactionScope 외부에서 사용되는 경우 모든 기능이 올바르게 작동합니다.TransactionScope 인스턴스 내에서 사용되는 경우 호출로 인해 항상 트랜잭션이 중단됩니다.메시지 = "거래가 중단되었습니다."
이 호출이 트랜잭션 내에서 작동하도록 하려면 어떻게 해야 합니까?가능합니까?클라이언트 트랜잭션이 서비스 경계를 넘어 흐르려면 바인딩이 트랜잭션 흐름을 지원해야 하며, 이는 NetNamedPipeBinding, NetTcpBinding, WSHttpBinding, WSDualHttpBinding 및 WSFederationHttpBinding으로만 바인딩을 즉시 제한한다는 내용을 읽었습니다.
해결책
나는 MSMQ에 대해 자세히 알지는 못하지만 Tom Hollander가 쓴 정말 좋은 블로그 게시물 시리즈가 있습니다. MSMQ, IIS 및 WCF:아이들이 잘 놀 수 있게 해주기 - 3부에서는 Tom이 거래에 관해 이야기하는 링크가 제공됩니다.
MSMQ는 트랜잭션이 가능하거나 그렇지 않을 수 있습니다.그리고 WCF에서는 서비스 계약과 개별 작업 계약(메서드)을 트랜잭션 컨텍스트 허용, 거부 또는 요구 여부와 같은 트랜잭션 관련 특성으로 꾸밀 수 있습니다.
내가 아는 한, 귀하의 설정에서는 MSMQ 부분이 트랜잭션이 되는 것을 원하지 않지만 주변 트랜잭션이 있는 경우에도 이를 사용할 수 있어야 합니다.이 경우 다음과 같이 작업 계약에 TransactionFlow="ALlowed"를 추가해야 합니다.
[ServiceContract]
public interface ILoggingService
{
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
void LogData(......);
}
그러면 됩니다!
마크
다른 팁
쓸데없는 질문이라 죄송합니다...
내 문제를 해결했습니다.배치해야 했어요
[TransactionFlow(TransactionFlowOption.Allowed)]
서비스 계약의 운영에 대해
[OperationBehavior(TransactionScopeRequired=true)]
계약 이행(서비스 자체)에 관한 것입니다.
대접을받습니다.