Come posso verificare che un host WCF è disponibile prima di usare un canale da un client?

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

Domanda

Io sono la creazione di un servizio di Windows che inizia una serie di processi di schiavi. In ognuno di questi processi schiava mi metto in ascolto su una named pipe per il messaggio dal processo di master.

Al momento ho la situazione in cui il processo di padrone chiama uno slave tramite una pipe con nome prima che lo slave è completamente avviato e si mette in ascolto sulla named pipe.

    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 faccio questo canale entra nel CommunicationState.Faulted e le eventuali chiamate successive sul canale fallire.

Che cosa posso fare per verificare dal master che il processo di schiavi si mette in ascolto? O come posso recuperare dal <=> per riprovare la mia chiamata remota?

È stato utile?

Soluzione

L'unico modo per uscire dallo stato di Faulted è quello di reiniailize Client WCF da ri-costruire l'istanza e chiamare il metodo Open ().

In generale, prima di chiamare il servizio, ho sempre controllare la proprietà di stato e, se non è aperto provo a reinizializzare come ho descritto sopra. Se fallisce, c'è un problema con il server. (Nel mio caso, lo stato viene colpevolizzata a causa di inattività, quindi l'inizializzazione succedes ussually)

Altri suggerimenti

È possibile allegare alla manifestazione "ServiceFaulted" sull'host, e utilizzare questo per eseguire la gestione degli errori. Secondo la documentazione, l'azione corretta è quello di interrompere l'host. È quindi possibile provare e reinizializzarlo ma può essere un esercizio di futilità se il sistema non è attivo.

Forse si potrebbe implementare una "sessione" servizio basato. Così il cliente apre il canale WCF ed effettua una chiamata per aprire la sessione (ad es. Una chiamata "aperto"). Questo avrebbe lasciato il vostro ospite sa che lo schiavo è in ascolto.

Si potrebbe desiderare di indagare il meccanismo di callback di WCF in modo che la comunicazione remota allo slave viene fornito tramite una richiamata dal "aperto" chiamata fatta da esso una volta che è inizializzato.

Alex Drenea è corretto nel dire che si desidera creare una nuova istanza. Consiglierei visto uno sguardo alla classe ChannelFactory in WCF per la creazione di proxy. È possibile utilizzare questo con un certo try comportamento di tipo cattura a che fare con la messa in funzione del vostro schiavo. Si consiglia inoltre di inserire uno System.Diagnostics.Debugger.Break () nel codice di avvio processo schiavo come il debugger non può attaccare in modo da non vedere l'eccezione nel processo slave.

Posso chiedere se si ha realmente bisogno di isolamento del processo o se utilizza la sincronizzazione e le discussioni essere sufficiente per il vostro compito?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top