Dado:
- la aplicación - interfaz gráfica de usuario de escritorio (WPF) aplicación .NET
- ventanas servicio de observación para la aplicación (.NET también)Conexión a través de canalización con nombre de servicio de Windows (Sesión # 0) para aplicación de escritorio (Sesión # 1)
El servicio de Windows periódicamente "hace ping" a la aplicación para asegurarse de que esté en buen estado (y si no es así, winservice la reiniciará).
Iba a implementar "pinging" a través de named pipes. Para hacer las cosas más simples, decidí hacerlo con WCF. La aplicación aloja un servicio WCF (una operación Ping que devuelve algo). El servicio de Windows es un cliente para este servicio WCF, lo invoca periódicamente en función de un temporizador.
Eso es todo en Windows 7.
El servicio de Windows se ejecuta en LocalService (en la sesión # 0).
La aplicación de escritorio se está ejecutando bajo el usuario actualmente conectado (en la sesión n. ° 1).
El problema: servicio
Windows no puede ver WCF punto final (con NetNamedPipeBinding) creada en y ser escuchado en la aplicación de escritorio. Eso significa que en llamada a través del proxy wcf obtengo esta excepción: "El punto final de la tubería 'net.pipe: // localhost/HeartBeat' no se pudo encontrar en su máquina local"
Estoy seguro de que el código está bien, porque otra aplicación de escritorio (en la sesión n. ° 1) puede ver el punto final.
Obviamente aquí estoy tratando con algunas cosas de seguridad para el aislamiento de objetos del sistema Win32. Pero creo que debería haber una forma de resolver las restricciones con las que me he encontrado.
Puedo sacrificar el enfoque de WCF y seguir el camino de NamedPipe en bruto.
¿Está seguro de que el servicio de Windows está intentando abrir el canal DESPUÉS de que se ejecuta la aplicación de escritorio? Cuando el servicio de Windows "no puede ver" el punto final WCF, ¿cuáles son los detalles de la excepción? –
> # 1: sí, estoy seguro, porque winservice está haciendo esto (llamando por wcf) periódicamente (en bucle infinito). – Shrike
> # 2: el servicio winservice "no puede ver" significa que al llamar a un proxy wcf obtengo la siguiente excepción: "El extremo del conducto 'net.pipe: // localhost/HeartBeat' no se pudo encontrar en su máquina local" – Shrike