¿Cómo comunicarse con un servicio de Windows desde una aplicación que interactúa con el escritorio?

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

Pregunta

Con .Net, ¿cuál es la mejor manera de interactuar con un servicio (es decir,¿Cómo se comunican la mayoría de las aplicaciones de bandeja con sus servidores)?Sería preferible que este método también fuera multiplataforma (funciona en Mono, así que supongo que la comunicación remota está descartada).


Editar:

Olvidé mencionar que todavía tenemos que admitir máquinas con Windows 2000 en el campo, por lo que WCF y cualquier otra versión superior a .Net 2.0 no funcionará.

¿Fue útil?

Solución

Tenga en cuenta que si planea implementar eventualmente en Windows Vista o Windows Server 2008, muchas formas en que se puede hacer hoy no funcionarán.Esto se debe a la introducción de una nueva característica de seguridad llamada "Aislamiento de sesión 0".

La mayoría de los servicios de Windows se han movido para ejecutarse ahora en la Sesión 0 para aislarlos adecuadamente del resto del sistema.Una extensión de esto es que el primer usuario que inicia sesión en el sistema ya no se ubica en la Sesión n.° 0, sino en la Sesión 1.Y, por lo tanto, el aislamiento romperá el código que realiza ciertos tipos de comunicación entre servicios y aplicaciones de escritorio.

La mejor manera de escribir código hoy en día que funcione en Vista y Server 2008 en el futuro cuando se realice comunicación entre servicios y aplicaciones es utilizar una API de procesos cruzados adecuada como RPC, Named Pipes, etc.No utilice SendMessage/PostMessage ya que fallará en el aislamiento de sesión 0.

http://www.microsoft.com/whdc/system/vista/services.mspx

Ahora, dados sus requisitos, se encontrará en un aprieto.En cuanto a las inquietudes multiplataforma, no estoy seguro de si se admitiría la comunicación remota.Es posible que tengas que bajar y regresar a los sockets: http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

Otros consejos

Si se trata de una aplicación de bandeja y no de un verdadero servicio, tenga cuidado al configurar sus comunicaciones si utiliza tuberías o TCP/IP.Si varios usuarios inician sesión en una máquina (Citrix, Escritorio remoto) y cada usuario inicia un "servicio" de aplicación de bandeja, entonces puede encontrarse con una situación en la que varios procesos intentan utilizar el mismo puerto o canalización bien conocido.Por supuesto, esto no es un problema si no planea admitir múltiples canalizaciones o si tiene un verdadero servicio en lugar de una aplicación de bandeja que se ejecuta en cada shell de usuario.

Haga que su servicio escuche 127.0.0.1 en un puerto predefinido con un conector de flujo TCP antiguo y simple.Conéctese a ese puerto desde su aplicación de escritorio.

Es muy simple y completamente multiplataforma.

¿Alguno de ustedes realmente intentó comunicarse de forma remota con Mono?Funciona muy bien.Es posible que se encuentre con algunos casos extremos, pero esto es muy poco probable.Simplemente pruebe su aplicación para comunicación remota multiplataforma (MS.Net <-> Mono) de vez en cuando para detectar posibles fallos.Y comience con un Mono reciente, 2.4.2 es el actual.

La comunicación remota es una opción, pero no es multiplataforma.Algunas otras formas son utilizar canalizaciones con nombre, IPC o eventos del kernel.

¡Curiosamente iba a sugerir Remoting!El Notas de la versión Mono 1.0 (de archive.org porque falta la ubicación original) menciona System.Runtime.Remoting.dll como biblioteca compatible y no dice nada sobre problemas conocidos.

Si la comunicación remota está descartada, entonces probablemente tenga que implementar su propio protocolo de enmarcado de mensajes TCP.Windows no tiene un equivalente a los sockets de dominio UNIX para la comunicación en la misma máquina.

La mayoría de los servicios que tienen un componente GUI se ejecutan como un usuario designado y se les permite acceder al escritorio.Esto te permite acceder a través de COM o .NET pero sólo localmente (a menos que quieras complicarte)

Personalmente, abro un socket antiguo y común en el servicio: es multiplataforma, permite múltiples clientes, permite que cualquier aplicación acceda a él, no depende de la seguridad de Windows para abrirlo y permite que su GUI se escriba en cualquier idioma que te guste (ya que todo admite sockets).

Para una aplicación de bandeja, querrá un protocolo simple para comunicarse; también puede usar un sistema de estilo REST para enviarle comandos y transmitir XML (yuk) o un formato de datos personalizado.

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