Comment puis-je vérifier qu'un hôte WCF est disponible avant que j'utiliser un canal d'un client?

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

Question

Je suis en train de créer un service Windows qui démarre un certain nombre de processus esclaves. Dans chacun de ces processus esclave je commence à écouter sur un tube nommé pour le message du processus maître.

J'ai actuellement la situation où le processus maître appelle un esclave via un tube nommé avant l'esclave est entièrement démarré et commence à écouter sur le canal nommé.

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

Si je fais le canal entre dans tous les appels et CommunicationState.Faulted ultérieurs sur le canal échouent également.

Que puis-je faire pour vérifier du maître que le processus esclave commence à écouter? Ou comment puis-je récupérer de la nouvelle tentative de mon <=> appel à distance?

Était-ce utile?

La solution

La seule façon de sortir de l'état Faulted est reiniailize le client WCF en re-construction de l'instance et appeler la méthode Open ().

En général, avant d'appeler le service, je vérifie toujours la propriété d'état et si elle est pas ouvert, j'essaie de le réinitialiser comme je l'ai décrit ci-dessus. Si elle échoue, il y a un problème avec le serveur. (Dans mon cas, l'état se défaut en raison d'inactivité, si l'initialisation succedes ussually)

Autres conseils

Vous pouvez joindre à l'événement « ServiceFaulted » sur l'hôte et l'utiliser pour effectuer la gestion des erreurs. Selon la documentation, l'action correcte est d'abandonner l'hôte. Vous pouvez alors essayer de le réinitialiser, mais il peut être un exercice futile si le système est en panne.

Peut-être que vous pourriez mettre en œuvre une « session » de service basé. Ainsi, le client ouvre le canal WCF et fait un appel pour ouvrir la session (par exemple. Un appel « ouvert »). Cela permettrait à votre hôte sache que l'esclave est à l'écoute.

Vous pouvez étudier le mécanisme de rappel de WCF afin que la communication à distance à l'esclave est fourni par un rappel de l'appel fait « ouvrir » par elle une fois initialisées.

Alex Drenea est exact de dire que vous voulez créer une nouvelle instance. Je recommande d'avoir un coup d'œil à la classe ChannelFactory dans WCF pour créer les procurations. Vous pouvez l'utiliser avec un comportement de type de capture d'essayer de faire face à la première mise en service de votre esclave. Vous pouvez également placer un System.Diagnostics.Debugger.Break () dans votre code de démarrage du processus esclave que le débogueur ne peut attacher de sorte que vous ne voyez pas l'exception dans votre processus esclave.

Puis-je demander si vous avez vraiment besoin de l'isolement processus ou si la synchronisation et utiliser des fils pour être suffisamment votre tâche?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top