Como posso verificar que um host WCF está disponível antes de eu usar um canal de um cliente?

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

Pergunta

Estou criando um serviço do windows que inicia uma série de processos escravos. Em cada um destes processos escravo eu começar a ouvir em um pipe nomeado para a mensagem do processo mestre.

Eu tenho atualmente a situação em que o processo mestre chama um escravo através de um tubo chamado antes que o escravo é totalmente iniciado e começa a escutar no pipe nomeado.

    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();

Se eu fizer isso o canal fica em CommunicationState.Faulted e quaisquer chamadas subsequentes no canal falhar também.

O que posso fazer para verificar com o mestre que o processo escravo começa a ouvir? Ou como posso recuperar da CommunicationState.Faulted para repetir o meu apelo remoto?

Foi útil?

Solução

A única maneira de recuperar o estado de falha é reiniailize o WCF cliente através da construção de re-a instância e chamar o método Open ().

Em geral, antes que eu chame o serviço, eu sempre verificar a propriedade Estado e se ele não está aberto Eu tento reinicializar-lo como eu descrevi acima. Se ele falhar, há um problema com o servidor. (No meu caso, o Estado fica criticado devido à inatividade, de modo a inicialização ussually succedes)

Outras dicas

Você pode anexar ao evento "ServiceFaulted" no host, e usar isso para executar o tratamento de erros. De acordo com a documentação, a ação correta é para abortar o host. Você pode, então, tentar reinicializar-lo, mas pode ser um exercício de futilidade se o sistema está em baixo.

Talvez você poderia implementar uma "sessão" serviço baseado. Assim, o cliente abre o canal WCF e faz uma chamada para abrir a sessão (por exemplo. Uma chamada "aberto"). Isso permitiria que o seu know host que o escravo está escutando.

Você pode querer investigar o mecanismo de retorno de chamada de WCF para que a comunicação remota para o escravo é fornecida através de uma chamada de retorno da chamada "aberta" feita por ele uma vez que tenha inicializado.

Alex Drenea está correto em dizer que você deseja criar uma nova instância. Eu recomendaria ter um olhar para a classe ChannelFactory em WCF para criar os proxies. Você pode usar isso com alguma tentativa comportamento tipo prendedor de lidar com a primeira inicialização do seu escravo. Você também pode querer colocar um System.Diagnostics.Debugger.Break () em seu código de inicialização do processo escravo como o depurador não pode anexar para que você não veja a exceção em seu processo de escravo.

Posso perguntar se você realmente precisa de isolamento do processo ou se utilizar a sincronização e tópicos ser suficiente para a sua tarefa?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top