2011-02-28 4 views
2

오류가 발생한 채널의 개념을 일부 바인딩의 수동 구현으로 다시 매핑 할 수 없습니다. 나는이 WCF 기능이 성가신다고 생각하며, 사용하지 못하게하는 방법이 있는지 궁금합니다.WCF 채널 폴트 상태가 전혀 도움이됩니까?

예를 들어 TCP를 사용하십시오. 대부분의 TCP 통신이 끊어졌습니다. 그렇다면 어째서 하나의 연결이 채널을 잘못 만들고 다음 연결을 모두 끊어 버릴까요?

명명 된 파이프 및?

아마도 내가 잘못 생각한 것 같습니다. 그래서 그것이 왜 기능이 아니라 버그인지 설명하십시오.

답변

7

Faulted은 많은 WCF 추상화 구현으로 구워진 CommunicationObject 상태 머신의 상태 중 하나입니다. 그것은 본질적으로 그 객체에 대한 "게임 오버"를 의미하므로, 당신이 그것을 불가능하게하는 방법을 찾지 않을 것입니다.

확실히이 버그는 아닙니다 :이 모든 인공물의 근간을 이루는 CommunicationObject 상태 시스템은 의식적인 디자인 선택이었습니다. WCF 설계자가 내린 설계 결정에 대해 논쟁하는 것은 흥미로운 일이긴하지만 궁극적으로 WCF를 사용하기를 원한다면 그 일이 어떻게 진행되고 진행되는지를 받아 들일 필요가 있습니다.

채널은 사용되는 전송을위한 단순한 어댑터가 아닌 통신 스택 (전송, 인코딩, 보안, 세션 관리)의 여러 계층을 포괄하는 고차원 추상화입니다. , 트랜잭션 흐름, 양면 인쇄 등).

특정 바인딩의 세부 사항까지 살펴보면 이전 통신 시도가 실패한 후에도 안전하게 재사용 할 수있는 범위 내에서 내결함성이있는 스택 요소를 찾을 수 있습니다 (예 : HTTP 프로토콜). 여러분이 언급 한 것조차 (TCP, Named Pipes)조차도 여러분이 제안하는 것처럼 내결함성이 없습니다.

상태 머신 또는 그와 유사한 것이 모든 구성 레이어/요소의 핵심 세부 사항보다 높은 수준에서 작동하는 채널 추상화를 가지려면 다소 중요하다고 생각합니다. 그것은 간단한 규칙을 가능하게합니다 : 그것이 Faulted 인 경우 버리고 새로운 것을 만드십시오. 예, 안전하게 재사용 할 수있는 리소스를 유지함으로써 가능한 최적화를 놓친 경우가있을 수 있습니다. 그러나 이것은 통신의 훨씬 단순한 추상화 작업에 대해 지불하는 (작은) 비용입니다.

11

나는 Juval Löwy (WCF 건축가 중 한 명)의 제품으로 WCF의 전반적인 철학이라고 생각합니다. 그의 책 프로그래밍 WCF 서비스 인용 :

이 [예외 시스템을 사용하는 일반적인 방법] 플랫폼으로 .NET의 근본적인 결함이다. [...] 여기서 [예외가 던져진 후에], 완전히 예상치 못한 무언가가 일어났습니다. 클라이언트가 어떻게 다른 방식으로 가장 할 수 있습니까? 개체가 절망적으로 손상 될 수 있지만 클라이언트는 계속 개체를 사용합니다.

생각

은 당신이 사용하고있는 중 전송 채널의 다른 쪽의 객체와 통신, 결국이며, 객체가 예외를 throw하는 경우, 그것은 더 이상 가능하지 않을 수도 있다는 점이다. 흥미로운 점이지만, 완전히 동의한다는 확신이 없습니다. (실제로 말하면, 실제로는 짜증이 날 수 있습니다.)

+5

한 말을 좋아하는 경우 : * 서비스가 폭발 - 혈액과 신체 부분이 온통 거기;을 그리고 여전히 다시 시도해보고 싶습니까? * - 그 이상으로 그래픽을 얻을 수는 없습니다 :-) –

0

이 WCF가하는 일입니다 :

여기
Proxy a = new Proxy(); 
a.SomeOp() -> threw exception 
a.SomeOtherOp() -> faulted 

가 'SomeOp'이 아닌 'A'를 실패, 왜 실패 할 SomeOtherOp는 무엇입니까?

이 만드는 의미 Juval으로

Proxy a = new Proxy(); -> threw exception 
a.SomeOp() -> faulted 
관련 문제