2011-06-24 18 views
6

Tengo un servicio WCF alojado en el servicio de Windows y tengo 2 ensamblajes el host (.exe) y la biblioteca de servicios (.dll). Cuando se actualiza la biblioteca de servicios, debemos detener el servicio para poder reemplazar la biblioteca. Me gustaría tener una funcionalidad similar a IIS, como reemplazar la biblioteca sin reiniciar el servicio. ¿Es posible y cómo?Reemplazar la biblioteca del servicio WCF sin reiniciar el servicio

Respuesta

4

IIS utiliza algo llamado una instantánea para lograr esto. Podría implementar algo similar para su servidor de servicio. Básicamente, la idea es que antes de comenzar el servicio, copie el .DLL a otra ubicación y haga que el host cargue su clase de servicio desde esa copia. El host luego configura un monitor del sistema de archivos para escuchar los cambios en el archivo original. Si detecta uno, detiene el servicio, copia el nuevo archivo y se reinicia.

EDITAR

(1) Para iniciar una ServiceHost usando una clase en una biblioteca de tipo específico, que tendría que utilizar la reflexión. Algo como lo siguiente:

Assembly myAssembly = Assembly.LoadFile(path); 

Type serviceType = myAssembly.GetType(className); 

ServiceHost serviceHost = new ServiceHost(serviceType); 

No está claro en la documentación cómo LoadFile resuelve las dependencias. Es posible que deba enlazar el evento Assembly.ModuleResolve para que esto funcione.

(2) Los monitores del sistema de archivos seguramente incurren en algunos gastos generales, pero en mi experiencia, es mínimo. En cualquier caso, esta es realmente su única opción a menos que desee ir con un instalador para las DLL actualizadas.

(3) No tengo idea de por qué su archivo está bloqueado. Tendrás que solucionarlo tú mismo.

+0

Gracias por el anser Peter. Solo me gustaría entender lo que quiere decir con el reinicio del host, ¿quiere decir que de todos modos el servicio de Windows debe reiniciarse? – NDeveloper

+0

No. La aplicación del servicio de Windows nunca se reinicia. Un "reinicio" significa cerrar el objeto ServiceHost que aloja su servicio, copiar la nueva DLL, luego crear y comenzar un nuevo objeto ServiceHost. –

+0

Y no sería un problema tener muchos de esos servicios. Quiero decir, ¿no afectaría el rendimiento del sistema tener muchos archivadores? Y también cómo decirle a ServiceHost que cargue el ensamblaje desde el directorio exacto. – NDeveloper

2

Peter tiene una sugerencia. Según el tamaño y si puede garantizarlo, otra es mover su infraestructura a al menos 2 servidores agrupados. Esto le permite actualizar uno a la vez, mientras que el otro continúa recibiendo solicitudes. Siempre que la versión se realice correctamente (cambios de contrato == método nuevo), esta metodología funciona bien, ya que los clientes más antiguos continúan obteniendo los mismos datos independientemente de sus nuevos bits.

+0

Sí, los servidores en clúster pueden ser una solución práctica, pero estoy interesado en reemplazar lib sin reiniciar el servicio si hay una interrupción o no. – NDeveloper

Cuestiones relacionadas