2010-12-13 5 views
0

WCF를 사용하여 클라이언트 - 서버 연결을 돕기 위해 미니 프레임 워크를 작성 중이며 예기치 않은 동작이 발생했습니다.WCF : 스트리밍과 바인딩을 사용하는 채널이 서버가 존재하지 않을 때 오류가 발생하지 않습니다.

클라이언트가 사용할 수없는 서비스에 대한 채널을 연 다음 해당 서비스에 대해 메소드 호출을하면 채널에 대한 바인딩에서 transferMode를로 설정했는지 여부에 따라 결과 동작이 달라집니다 "스트리밍".

바인딩이 스트리밍으로 설정되어 있지 않고 서비스를 사용할 수없는 경우 WCF는 즉시 ICommunicationObject.Faulted 이벤트를 발생시킵니다. 반면에 WCF가 있으면 ICommunicationObject.Opened 이벤트가 발생합니다.

아무도이 행동의 차이에 대한 이유를 설명 할 수 있습니까? 꽤 이상하게 보입니다.

답변

0

글쎄, 나는 이것을 몇 시간 동안 연구 해왔고 나는 대답을 가지고 있다고 믿는다. (아무도 더 좋은 대답이 없다면 나는 대답으로 표시 할 것이다.)

은 MSDN의 this article에 따르면, "모든 스트리밍 호출 (데이터 그램 채널) 단일 채널을 통해 세션을 사용하도록 구성되어 사용되는 바인딩 경우에도 세션을 지원하지 않습니다 만들어집니다." (굵게 표시된 텍스트에 유의하십시오.) TCP/IP 프로토콜을 통해 데이터 그램 채널을 사용한다는 것이 어떤 의미인지는 분명하지 않지만 필자는 액면 그대로 받아 들일 것입니다.

따라서 another msdn article은 "데이터 그램 채널은 모든 메시지가 상관 관계가없는 채널입니다. 데이터 그램 채널의 경우 입력 또는 출력 작업이 실패하면 다음 작업은 일반적으로 영향을받지 않으며 동일한 채널이 될 수 있습니다 이 때문에 데이터 그램 채널은 일반적으로 오류가 발생하지 않습니다. "

그래서 분명히 스트리밍 채널은 오류가 발생하지 않습니다. 채널을 통해 메시지를 보내려고하면 소켓 예외가 발생하지만 (WCF와 관련하여 서비스를 사용할 수없는 경우 소켓을 열 수 없으므로) 이는 채널 상태에 오류가 있음을 의미하지 않습니다. 즉, 동일한 채널을 통해 다른 메시지를 계속 보낼 수 있으며 서비스를 사용할 수있게되면 메시지가 성공적으로 전송 될 수 있습니다.

여전히 소켓 연결이 이루어지지 않았을 때 채널의 상태가 열린 것으로 간주되지만 이상하게 보입니다. 그래서 나는 누군가가 이것을 더 깊이 이해한다면 여전히 설명을 듣게되어 기쁘다.

+1

데이터 그램은 비 연결형 프로토콜 인 UDP가 사용되고 있음을 의미합니다 (TCP 아님). 즉, 연결 상태를 알릴 방법이 없습니다. (http://msdn.microsoft.com/en-us/library/ms751494.aspx의 MEP 섹션을 참조하십시오.) 그렇다면 여러분이 말한 것은 말이죠. 나는 그들이 핸드 셰이크 오버 헤드를 피하기 위해 스트리밍을 위해 UDP를 사용하고 있다고 생각합니다. TCP 외에도 필요합니다.하지만 세션을 요청하는 바인딩을 사용하여이 작업을 수행하는 것은 좋지 않습니다. (나는이 재료에 익숙하지 않지만이게 옳다고 생각한다.) – paul

+0

나는 이것이 옳다고 확신하지 않는다. 게시 한 기사조차도 WCF를 확장하기위한 옵션으로 UDP에 대해 설명하고 WCF에 내장 된 것과는 다릅니다. 또한 명시 적 TCP 바인딩 구성이 암시 적으로 UDP를 전송 채널로 사용한다고 생각하는 데 약간의 어려움이 있습니다. 물론, 당신은 결코 알지 못합니다 :) – joniba

관련 문제