클라이언트의 채널을 사용하기 전에 WCF 호스트를 사용할 수 있는지 어떻게 확인할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1078037

문제

여러 노예 프로세스를 시작하는 Windows 서비스를 만들고 있습니다. 이러한 각 슬레이브 프로세스에서 나는 마스터 프로세스의 메시지를 위해 이름이 지정된 파이프를 듣기 시작합니다.

나는 현재 노예가 완전히 시작되기 전에 명명 된 파이프를 통해 마스터 프로세스가 슬레이브를 호출하고 지명 된 파이프에서 듣기 시작하는 상황이 있습니다.

    ProcessStartInfo processStartInfo = new ProcessStartInfo("slave");
    processStartInfo.Arguments = Address 

    Process process = new Process();
    process.StartInfo = processStartInfo;

    process.Start();

    base.Endpoint.Binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
    base.Endpoint.Address = Address;

    base.Channel.RemoteMethod();

내가 이것을하면 채널이 들어갑니다 CommunicationState.Faulted 그리고 채널의 후속 통화도 실패합니다.

노예 프로세스가 듣기 시작한 것을 마스터로부터 확인하려면 어떻게해야합니까? 또는 어떻게 회복 할 수 있습니까? CommunicationState.Faulted 내 원격 통화를 다시 시도하려면?

도움이 되었습니까?

해결책

결함 상태에서 복구하는 유일한 방법은 인스턴스를 다시 제작하여 WCF 클라이언트를 다시 제외하고 Open () 메소드를 호출하는 것입니다.

일반적으로 서비스를 호출하기 전에 항상 상태 속성을 확인하고 개설되지 않으면 위에서 설명한대로 재구성을 시도합니다. 실패하면 서버에 문제가 있습니다. (제 경우에는 무 활동으로 인해 상태가 잘못되므로 초기화는 연락했습니다.

다른 팁

호스트의 "ServiceFaulted"이벤트에 첨부하고이를 사용하여 오류 처리를 수행 할 수 있습니다. 문서에 따르면 올바른 조치는 호스트를 중단시키는 것입니다. 그런 다음 그것을 시도하고 다시 이용할 수 있지만 시스템이 다운되면 무익한 운동 일 수 있습니다.

아마도 "세션"기반 서비스를 구현할 수 있습니다. 따라서 클라이언트는 WCF 채널을 열고 세션을 열기 위해 전화를합니다 (예 : "Open"호출). 이것은 당신의 호스트에게 노예가 듣고 있음을 알릴 것입니다.

WCF의 콜백 메커니즘을 조사하여 슬레이브와의 원격 통신이 초기화 된 일단 "오픈"호출의 콜백을 통해 제공되도록 할 수 있습니다.

Alex Drenea는 새 인스턴스를 만들고 싶다고 말하는 데 맞습니다. 프록시를 만들기 위해 WCF의 ChannelFactory 클래스를 살펴 보는 것이 좋습니다. 노예의 초기 스타트 업을 처리하기 위해 일부 시도 캐치 유형 동작과 함께이 작업을 사용할 수 있습니다. 디버거가 첨부되지 않을 수 있으므로 슬레이브 프로세스에서 예외가 표시되지 않으므로 System.Diagnostics.debugger.break ()를 슬레이브 프로세스 시작 코드에 배치 할 수도 있습니다.

프로세스 격리가 실제로 필요한지 또는 동기화와 스레드를 사용하여 작업에 충분한 지 물어볼 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top