2010-03-18 4 views
7

Estoy diseñando una pieza de software que necesita operar diferentes piezas de hardware basadas principalmente en un cronograma, pero también necesita una interfaz web para configurar ajustes, configurar el cronograma y, posiblemente, incluso controlar manualmente el hardware. No estoy seguro de cómo diseñar la arquitectura de un software como este.¿Cómo diseño un .NET (C#) para un programa que necesita ejecutarse como un servicio de Windows pero que también tiene una interfaz web?

Una idea que tuve fue crear un servicio de Windows que realiza la comunicación con el hardware así como "publicar" servicios web a través de WCF y luego tener una aplicación ASP.NET que luego controla el servicio de Windows a través de WCF. Este enfoque parece ser mucho trabajo para lo que estoy tratando de lograr.

¿Podría alguien darme alguna dirección, este es un buen enfoque o no, e incluso darme una mejor manera de hacerlo si existe?

Gracias! Joel

+0

Por razones de seguridad, la mejor solución dependerá mucho de la configuración de su hardware. ¿Cómo acepta la maquinaria las solicitudes? ¿Dónde residirá su sitio web con respecto a su servicio de Windows? ¿Qué firewalls están involucrados? ¿Puede ejecutar un servicio de Windows que sondee un servicio web y también tenga una UI? – pdr

+0

La maquinaria acepta solicitudes principalmente a través de uno o más puertos seriales (redes RS485). El sitio web podría estar en la misma máquina que el servicio, pero me gusta la posibilidad de dividirlos si es necesario. Probablemente el cortafuegos no sea un problema en este caso, ya que todo estará en la misma red. ¿Puedes explicar lo que quieres decir con ser un "servicio de Windows que sondea un servicio web y también tiene una UI"? No estoy seguro de cómo un servicio de Windows podría tener una IU. – hjoelr

+0

Si desea alojar la interfaz web en una máquina diferente, no hay alternativa a su pensamiento. – SLaks

Respuesta

1

Puede instanciar un punto final WCF como un servicio TCP desde el servicio de Windows, como se explica en MSDN: How to: Host WCF in a Windows Service Using TCP.

A partir de ahí, es relativamente sencillo consumir ese punto final en una aplicación ASP.NET (lo mismo que consumir cualquier otro punto final WCF).

En ausencia de razones convincentes para hacer lo contrario, este es probablemente el enfoque que tomaría. Su única otra opción es usar alguna otra forma de IPC, como archivos mapeados en memoria o pipes con nombre. WCF es mucho más fácil de poner en marcha.

+0

Esta es la solución a la que estaba llegando. Sin embargo, ahora no quería incorporar el servidor web ASP.Net en un servicio. Si eso requiere que siga usando WCF para la comunicación, este puede ser el camino a seguir. – hjoelr

+0

Mi siguiente pregunta con respecto a WCF es: ¿Sería lo suficientemente rápido como intermediario entre la interfaz de usuario web y el hardware?No creo que pueda esperar varios segundos para las respuestas de WCF. – hjoelr

+1

@hjoelr: WCF es muy rápido, incluso cuando tiene encriptado y otras extensiones activadas. Estoy acostumbrado a tiempos de respuesta del orden de 1/4 de segundo desde servidores remotos; Normalmente, la única demora se debe a la latencia de la red, y si tiene todos los servicios ejecutándose en la misma máquina o al menos en la misma red, la latencia debería ser casi nula. – Aaronaught

0

Puede usar un archivo XML común (o algo) que el servicio supervise para ver los cambios. La interfaz web podría simplemente leer/escribir ese archivo XML. Esto solo funciona bien si el servicio y el sitio web se ejecutan en el mismo equipo (también puede hacerlo a través de un recurso compartido, pero esa es una configuración adicional y, en ese caso, es mejor que vaya con WCF).

+0

Buena idea. Sin embargo, es necesario que haya una comunicación bidireccional. El sitio web sondea la información del servicio, pero el sitio web también debe poder actualizar la configuración y demás en el servicio. – hjoelr

0

Puede incrustar un servidor web ASP.Net en el servicio utilizando la API de alojamiento ASP.Net, y luego usarlo para ejecutar un sitio web ASP.Net directamente.

Tenga en cuenta que el sitio ASP.Net se ejecutará en un dominio de aplicación independiente.

+0

Aún debe desarrollar el sitio ASP.NET por separado. Esto realmente no excluye la necesidad de encontrar un medio de comunicación entre la aplicación ASP.NET y el servicio, solo le permite ejecutar todo el paquete sin IIS. – Aaronaught

+0

@Aaronaught: simplemente puede pasar un 'MarshalByRefObject' que expone el servicio a' ApplicationHost.CreateApplicationHost' e interactuar con él en ASP.Net. (El proyecto ASP.Net debe hacer referencia al conjunto de servicios) – SLaks

+0

Este es un concepto interesante. No sabía que esto fuera posible. Veré si puedo investigar esto para ver si funciona para mi situación. – hjoelr

Cuestiones relacionadas