2012-02-15 2 views
6

데이터베이스에서 여러 작업을 실행하는 basicHttpBinding을 통해 WCF 서비스를 노출하고 있습니다.WCF basicHttpBinding : 클라이언트에 대한 응답이 실패 할 때 롤백

클라이언트가 응답을받지 못하면 WCF을 통한 트랜잭션 흐름이없는 롤백된다는 보장을 원합니다. 예. 클라이언트는 서버에서 실행되는 "DoX"메소드를 호출하지만 클라이언트가 종료되기 전에 클라이언트가 충돌합니다. 그런 다음 응답을 클라이언트에 보낼 수 없으면 데이터베이스 작업을 롤백해야합니다.

그렇게 할 방법이 있습니까? 이러한 방식으로 [OperationBehavior(TransactionScopeRequired=true)] 속성이 작동합니까? 서버 측에서 통신 오류를 처리 할 수 ​​있습니까?

는 업데이트 1 : 는 응답이 클라이언트로 전송하고, 따라서 클라이언트가 응답을 수신하지 않는 경우 롤백을 수행하는 데 사용할 수 없습니다 전에 [OperationBehavior(TransactionScopeRequired=true)]가 트랜잭션을 커밋 보인다.

업데이트 2 : 명확하게 다시 상태로, 나는 트랜잭션이 클라이언트 측과 어떤 방식으로 상호 작용을 할 필요가 없습니다. 클라이언트는 트랜잭션을 알지 못하며 트랜잭션을 취소하거나 커밋 할 수 없으며 바인딩을 통해 트랜잭션을 처리해야합니다. 전용 전송 채널이 수신 클라이언트에 메시지를 전달할 수없는 경우 롤백 할 트랜잭션을 서버 측에 지정합니다. TCP/IP의 경우이 정보는 서버에서 즉시 사용할 수 있어야합니다. 해야

그래서 서버 측 가상의 실행 흐름은 (클라이언트 측의 부족을 통지)합니다 (TCP 패킷의 어떠한 ACK 클라이언트로 다시 보낼) :

Receive client request 

Start transaction 

Execute all logic inside the service operation 

Send reply back to client 

if (reply.failedToReceive) { transaction.Rollback() } // due to a failing TCP/IP transmission 
+0

왜 basiHttpBinding을 사용해야합니까? wsHttpBinding은 이것을 줄 것이다. –

+0

@JustinDearing : 서비스에 액세스하는 클라이언트가 wsHttpBinding을 지원하지 않습니다. – GaussZ

+0

호기심에서 클라이언트 플랫폼이란 무엇입니까? http://wso2.com에 비누 클라이언트가 있습니까? –

답변

1

는에 쉬운 답이 없다 이 질문. WS- *에서 구현되었지만 기본 SOAP를 사용하여 수행되는 동작을 요청하고 있습니다. 난 당신의 유일한 옵션을 wsHttpBinding로 전환 할 수 없다고 생각하거나 @ Trevor Pilley가 제안한대로 duplex를 사용하면 기본 SOAP을 기반으로하는 사용자 정의 프로토콜에서 WS-Transaction의 동작을 모방하려고 시도하는 것입니다.

당신은 당신은 아마 단 하나의 서비스를 통해 트랜잭션을 지원해야합니다

  • 때문에 전체 WS-거래 명세서를 통해 약간의 단순화를 얻을 수 있어야합니다 - 당신은 몇 가지 독립적 통해 분산 트랜잭션을 수행하지 않습니다 서비스는
  • 당신은 모두 거래 (WS-AtomicTransaction)뿐만 아니라 장기 실행 트랜잭션 (WS-BusinessActivity가) probaby 원자 트랜잭션이 할 것 짧은
  • 당신은 확장 성 모델의 어떤 종류를 지원 할 필요가 없습니다 것입니다 (0,123 지원할 필요가 없습니다)
  • 프로토콜을 설명하는 검색/메타 데이터 모델을 구현할 필요가 없습니다 (예 : WSDL과 같음). 프로토콜 동작을 클라이언트와 서비스에 직접 코딩하기 때문입니다.

그러나 WS-Coordination과 WS-AtomicTransaction의 요소가 필요할 것입니다.이것은 어떤 수단으로도 단순한 작업이 아니며 롤백이 발생하지 않도록하거나 데이터베이스 성능이 저하 될 수 있으므로 데이터베이스 성능이 저하 될 수 있습니다. 추락 한 고객.

내가 말했듯이 이것은 복잡한 동작이며 미리 만들어진 표준화 된 프로토콜을 사용할 수 없다면 간단한 대답이 없습니다.

+0

질문에 대한 설명을 추가했습니다. 클라이언트에서 서버로의 응답 메시지 전송이 실패한 경우에만 트랜잭션을 롤백하려고합니다. 클라이언트는 절대로 작동하지 않거나 클라이언트가 TCP/IP 패킷을 수신하지 못하는 경우에만 발생합니다. – GaussZ

+1

그러나 서비스가 클라이언트가 메시지를 수신했는지 어떻게 알 수 있습니까? 두 번째 호출에서 서비스를 알릴 필요가 없을까요? 예를 들어, 초기 서비스 호출에 대한 응답에서 얻은 트랜잭션 ID를 전달하는 Commit 메소드로 ... –

+0

TCP로 생각하고있는 것을 볼 수 있습니다./IP ACK하지만 HTTP를 사용하고 있으며 기본 TCP/IP가 WCF에 의해 노출되지 않는다고 생각합니다. 실제로 HTTP는 반드시 TCP/IP를 기반으로하지는 않습니다. 신뢰할 수있는 운송 수단이 필요합니다. 이는 표준을 엄격히 준수하는 구현이 기본 와이어 프로토콜을 노출시키지 않는다는 것을 의미 할 수 있습니다. –

관련 문제