2009-11-03 4 views
5

Windows 서비스 내에서 호스팅되는 WCF 서비스가 있습니다. PerSession 모드에서 작동 중입니다. 이 서비스는 클라이언트가 파일을 열고 파일을 변경하고 서비스를 통해 원격으로 파일을 닫을 수있게합니다. 지금까지 모든 것이 매우 원활하게 작동합니다.WCF 서비스를 정상적으로 종료하십시오. 열려있는 모든 세션을 완료하고 새 세션을 제한하십시오.

Windows 서비스가 중지되면 WCF 서비스에서 새 세션을 허용하지 않고 이미 연결된 클라이언트가 현재 세션을 완료하고 적절한 시간/제한 시간 내에 작업 할 수있게하려고합니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

답변

7

기본적으로 ServiceHost.Close()을 호출하면 현재 실행중인 모든 요청이 완료 될 수 있지만 새로운 요청이 거부되는 경우 정상적인 종료가 진행됩니다.

서비스에 대해 구성한 바인딩에 "CloseTimeout"설정이 있습니다. WCF 런타임이 올바르게 종료 될 때까지 실행 요청을 허용하는 기간을 제어합니다. 타임 아웃이 발생하면 여전히 실행중인 요청이 종료됩니다.

반면에 ServiceHost.Abort() 방법은 슬레지 해머의 디지털 등가물입니다. 실행중인 모든 요청은 한 번에 종료되고 호스트는 종료됩니다.

클라이언트 측에서는 클라이언트 프록시에서 동일한 방법으로 작동하는 동일한 .Close().Abort() 메서드를 사용합니다.

+0

ServiceHost.Close를 호출하면 서비스가 즉시 클라이언트 연결을 닫습니다. 나는 내가 바라는 정상적인 폐쇄가 없다. 이 동작을 수정하는 구성이 있습니까? –

+0

@David : 아니요,이 기능을 켜기위한 설정을 모릅니다. 기본 동작이어야합니다. 아직 진행중인 서비스 호출은 정상적으로 완료되어야합니다. 그러나 이렇게하면 기존 세션이 끝날 때까지 열어 두지 않습니다. 서비스 호출이 현재 실행되고 있지 않으면 종료됩니다. –

+0

@marc_s : ServiceHost.Close를 사용하면 ServiceHost가 진행중인 모든 서비스 호출을 완료 할 수 있지만 내 클라이언트는 이미 System.ServiceModel.CommunicationException을 받았으며 응답을받지 못합니다. 이것은 당신이 기대하는 것입니까? 해결 방법은 무엇입니까? 클라이언트가 새로운 서비스 호출을 할 때 예외를 얻지 만 ServiceHost.Close가 호출 될 때 실행중인 서비스 호출이 완료되어 예상 값을 클라이언트에 반환해야하는 경우에는 문제가 없습니다. –

관련 문제