2016-09-08 1 views
1

하나는 트랜잭션이내 WCF 서비스 작업의

[OperationBehavior(TransactionScopeRequired = true)] 
public Car UpdateCar(Car c) 
{ 
} 

이전, 내가 PerCall으로 InstanceContextMode이 서비스를 실행중인 enabled-이 가능 및 들면, ConcurrencyMode 여러으로하는 저를 얻고 있었다 아래의 오류 -

처리되지 않은 'System.InvalidOperationException'형식의 예외가하여 System.ServiceModel.dll 에서 추가 정보를 발생 다음 'InventoryManager'서비스가 재로 구성되어 있습니다 leaseServiceInstanceOnTransactionComplete가 true로 설정되었지만 ConcurrencyMode가 Single로 설정되지 않았습니다. ReleaseServiceInstanceOnTransactionComplete에는 ConcurrencyMode.Single을 사용해야합니다.

위의 오류를 해결하기 위해 'ReleaseServiceInstanceOnTransactionComplete'를 false로 설정하고 트릭을 수행했습니다. 이 문제를 해결 'PerCall'과 '다중'의 경우와 서비스 인스턴스를 배치하는 방법

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall 
       , ConcurrencyMode = ConcurrencyMode.Multiple 
       , ReleaseServiceInstanceOnTransactionComplete = false)] 

은 도와주세요 사람이 이해 할 수 있습니다. 서비스 인스턴스를 해제하면 WCF가 생각하는 문제는 무엇입니까?

답변

0

이들은 WCF 디자이너가 설계 한 순수한 결정입니다. 책 프로그래밍 WCF 서비스에서

:

WCF 설계자가 제대로 거래의 얼굴에 자신의 sessionful 서비스의 상태를 관리하는 개발자를 신뢰하지 않았다. 따라서 세션 기반 트랜잭션 서비스를 적절한 상태 인식 프로그래밍 모델을 시행하기위한 호출 단위 서비스로 취급하기로 결정했습니다.

그리고 ConcurrencyMode.Multiple이있는 Percall 서비스는 물론 쓸모가 없습니다. 서비스로드 시간에 WCF는 ReleaseServiceOnTransactionComplete가 true 일 때 TransactionScopeRequired가 하나 이상의 작업에 대해 true이면 ConcurrencyMode가 ConcurrencyMode.Single임을 확인합니다. 그것은 당신이 관찰하는 행동입니다.

https://books.google.nl/books?id=PvNrurEhmiEC&pg=PA348&lpg=PA348&dq=per-session+transactional+services&source=bl&ots=CiDuKxG_Ox&sig=UvkgF1yTxmirsf_Zb452bW86AmQ&hl=nl&sa=X&ved=0ahUKEwiYjrX-uPrPAhWGfhoKHTgWBckQ6AEIHDAA#v=onepage&q=per-session%20transactional%20services&f=false

디자이너는 바로 거래의 얼굴에 WCF 핸들 동시성을 수 있도록하는 결정에 아마이었다. 서비스에서 자신의 동시성을 관리하기 란 어렵습니다.

예를 들어 다른 서비스의 클라이언트 역할도하는 서비스가 있습니다.

때로는 클라이언트 연결을 열려고 예외 throw하는 여러 서비스에 대한 동시성 모드를 변경하는 경우 :

"System.InvalidOperationException이 :) 전화가 열기 때문에 (이 채널에 전화를 걸 수 없습니다입니다 진행 중. "

이것은 디자이너가 피하고 싶었던 종류의 버그를 디버그하기가 어렵습니다. (제 생각에는)

관련 문제