¿Cómo puedo comprobar que un host WCF está disponible antes de que se use un canal de un cliente?

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

Pregunta

Estoy creando un servicio de windows que se inicia una serie de esclavo de los procesos.En cada uno de estos esclavos que tengo que empezar a escuchar en una canalización con nombre para mensaje de la maestra proceso.

Tengo actualmente la situación en la que el maestro de proceso llama a un esclavo a través de una canalización con nombre antes de que el esclavo se inicia completamente y empieza a escuchar en la canalización con nombre.

    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 hago esto, el canal se mete en CommunicationState.Faulted y todas las subsiguientes llamadas en el canal de fallar así.

¿Qué puedo hacer para verificar el maestro que el esclavo se inicia el proceso de escucha?O ¿cómo puedo recuperar a partir de la CommunicationState.Faulted para volver a intentar mi llamada remota?

¿Fue útil?

Solución

La única manera de recuperarse de estado de error es reiniailize el cliente WCF por la re-construcción de la instancia y llamar al método Open ().

En general, antes de llamar al servicio, siempre comprobar la propiedad de estado y si no se abre Trato de reinicializarla como he descrito anteriormente. Si falla, hay un problema con el servidor. (En mi caso, el estado se criticado debido a la inactividad, por lo que suele exhibir inicialización succedes)

Otros consejos

Puede adjuntar al evento "ServiceFaulted" en el host, y usar esto para llevar a cabo el tratamiento de errores. Según la documentación, la acción correcta es abortar el anfitrión. A continuación, puede tratar de reiniciarlo, pero puede ser un ejercicio inútil si el sistema está inactivo.

Tal vez usted podría poner en práctica una "sesión" servicio basado. Por lo que el cliente abre el canal de WCF y hace una llamada para abrir la sesión (por ejemplo. Una llamada "abierta"). Esto permitiría que su anfitrión sabe que el esclavo está escuchando.

Es posible que desee investigar el mecanismo de devolución de llamada de WCF de modo que se proporciona la comunicación remota al esclavo a través de una devolución de llamada desde la "abierto" llamada hecha por él una vez que se ha inicializado.

Alex Drenea tiene razón cuando dice que desea crear una nueva instancia. Yo recomendaría echar un vistazo a la clase ChannelFactory en WCF para la creación de las proxies. Puede utilizar este tipo con un comportamiento intento de captura para hacer frente a la puesta en marcha inicial de su esclavo. También puede colocar un System.Diagnostics.Debugger.break () en el código de inicio de proceso de esclavo como el depurador no puede adjuntar por lo que no se ve la excepción en su proceso de esclavo.

¿Puedo preguntar si realmente es necesario el aislamiento de procesos o si usa la sincronización y los hilos sean suficientes para la tarea?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top