2011-01-02 3 views
8

나는 WCF 주변의 로프를 배우는 중이다. 내가 할 계획이었던 것은 NetTcpBinding을 사용하는 클라이언트와 서버 사이에서 이중 채널을 열고 서버가 클라이언트에 요청을 시작할 수 있도록 무제한으로 열어 두는 것입니다.WCF - 채널을 오랫동안 열어 놓는 것이 좋지 않은가요?

나는이 장애물을 잡을 수 없기 때문에 채널을 무기한 열어 두는 것이 좋지 않다는 것을 나타내는 것처럼 보였습니다. 모든 상황이 불안정합니다.

맞습니까? NetTcpBinding을 사용하고 관계의 양쪽에 열린 채널에 대한 참조를 유지하면 통신 장애가 발생하면 어떻게됩니까? 실패 이벤트를 어떻게 잡을 수 있습니까? 거기에 다른 녀석들이 있습니까? NET Framework에서 어떤 차이가 있습니까? (4.0에 있습니다.)

답변

13

내가 제시에 동의하지 않습니다 ..... (보조 노트로 그는 또한 당신이 내 의견에서 최악의 생각이다 기본적으로 싱글로 WCF 서비스 클래스를 사용하는 것이 좋습니다)

서비스 클래스에 IErrorHandler 인터페이스를 구현하는 등 서버에서 예외를 잡아 두는 일만하면 채널을 계속 종료 할 필요가 없습니다. 특히 netTcpBinding을 사용하는 회사 LAN 환경에서는 그렇지 않습니다.

라이센스 비용이 자주 발생하는 데이터베이스 연결, 서비스 시스템에 대한 네트워크 연결을 유지하면 문제가 발생하지 않아야합니다. 또한 일반적으로 제한된 리소스가 아니므로 끊임없이 열거 나 닫는 것이 무의미한 것처럼 보입니다.

서비스 채널을 더 오랫동안 열어두면 클라이언트 측에서 장애를 처리 할 수 ​​있어야합니다. 채널에 장애가 발생한 상황, 예외가 발생한 후에 (예 : 네트워크가 다운되었거나 이와 유사한 상황) 복구 할 수 있어야합니다.

하지만 그렇게하면 모든 통화가 끝난 후 끊임없이 채널을 닫고 다음 시간 동안 다시 열어 볼 때 어떤 이점도 보이지 않습니다.

6

예 채널이 더 이상 필요하지 않게되면 닫는 것이 좋습니다. 그러나 이중 통신의 경우에는 일반적이지 않습니다. 이중 통신을 사용할 때 서버에서 클라이언트로 메시지를 다시 보낼 수 있도록 열린 채널이 필요합니다. WCF 통신은 항상 클라이언트에 의해 시작됩니다. 콜백은 클라이언트에 의해 시작된 채널을 열어 두는 것만으로 허용됩니다.

이중 통신에는 연결 실패를 처리하기위한 몇 가지 추가 작업이 필요합니다. 서비스가 클라이언트가 정기적 인 간격으로 연결을 확인할 수 있도록 일부 ping 메커니즘을 포함해야합니다. 연결에 실패하면 클라이언트는 예외를 수신하고 연결을 다시 설정할 수 있습니다. 또한 서비스는 오류가 발생한 채널에 콜백 메시지를 보낼 때 예외를 처리해야합니다.

관련 문제