2010-05-05 2 views
1

netTcpBinding을 사용하여 자체 호스팅 WCF 서비스를 만들었습니다. WinForm 기반 클라이언트를 사용하여이 서비스에 연결합니다. 나는 클라이언트가 가동되어 실행되는 동안 WCF 서비스에 연결이 끊어지는 것을 관찰했다.클라이언트가 연결을 시도 할 때 WCF 서비스 호스트가 "TCP error 10061 - connection refused"를 반환합니다.

이 문제를 해결하려면 연결을 유지하는 스레드를 만들었습니다. 클라이언트가 앉아서 약 일주일 후 내 로그에 오류 메시지가 나타납니다. TCP 연결 오류 10061 - 클라이언트가 연결을 거부했습니다. 연결 유지 스레드는 연결 개체를 다시 만들 수 없습니다. 로그에는 여전히 "연결이 거부되었습니다"라는 메시지가 표시됩니다.

서비스 호스트에 대한 구성 파일에 기본 주소는 있지만 끝점 주소는 없습니다. MSDN에서는 끝점 주소가 제공되지 않으면 끝점 주소가 Open 메서드가 호출 될 때 기본 주소가됩니다.

"TCP 연결 거부 됨"문제를 해결하기 위해 여전히 끝점 주소를 제공해야합니까?

미리 조언 해 주셔서 감사합니다.

답변

2

저는 주된 문제는 WCF 서비스에 항상 "연결되어있는"연결을 유지하려고한다는 것입니다. 이는 WCF 서비스로 수행하는 방법이 아닙니다.

WCF에서 "통화 별"활성화를 사용하는 것이 좋습니다. 클라이언트가 서비스를 호출하면 해당 요청에 대해 새롭게 분리 된 서비스 클래스 인스턴스가 생성되고 처리 된 다음 삭제되고 클라이언트와 서버 간의 연결이 기본적으로 다시 해제됩니다.

이제 NetTcpBinding은 서버와의 전송 수준 세션을 갖기 때문에 특별합니다.

  • 는 클라이언트 측 프록시를
  • 전화
  • 는 일반적으로 클라이언트 측 프록시를

을 닫으 서비스를 생성하지만, 여전히해야합니다.

또한 채널이 오류 상태이면 사용자가 잡히지 않고 처리하지 않는 서버 쪽에서 .NET 예외가 발생했음을 의미합니다. 이 경우 WCF는 "패닉 모드"로 전환하여 기본적으로 클라이언트와 서버 간의 연결 인 채널을 무효화합니다. 결국 서버 측 코드가 방아쇠를 당겼습니다. 채널을 유지하는 것이 중요한 이유는 무엇입니까?

서버 측에서는 모든 .NET 예외를 포착하고 처리해야하며 클라이언트로 다시 보내려면 SOAP 오류 (FaultException 또는 FaultException<T>)로 변환해야합니다. 채널을 스 래시하지 않습니다. WFC의 IErrorHandler 인터페이스를 확인하십시오.

클라이언트 측에서는 오류가있는 채널 상태를 확인하기 위해 일부 논리를 작성해야하며 실제로 오류가 발생하면이를 버리고 처음부터 재생성해야합니다.

모든 비트를 배치하면 WCF 서비스에 아무런 문제가 없습니다. 백그라운드 스레드와 같은 해킹이 없어도 연결을 유지할 수 있습니다.

+0

감사합니다. – Subbu

+0

내 응용 프로그램의 디자인은 서비스 호스트가 비동기 메시지를 클라이언트에 다시 보내야하는 것과 같습니다. 클라이언트 측 프록시를 닫을 경우 WCF 서비스에서 비동기 호출을 어떻게받을 수 있습니까?서비스가 고객에게 다시 전화 할 수있는 또 다른 방법이 있습니까? – Subbu

+0

@Subbu : 글쎄, 당신이 질문에 그 중요한 비트를 언급하지 않았다! 양방향 통신이 필요한 경우 .NET 예외로 인해 채널에 문제가 발생하지 않도록주의해야합니다. –

관련 문제