2010-05-27 16 views
18

Estoy buscando escribir un pequeño servicio web para ejecutar en una pequeña caja de Linux. Prefiero codificar en C#, así que estoy buscando usar Mono.¿HttpListener funciona bien en Mono?

No quiero la sobrecarga de ejecutar un servidor web completo o la versión Mono de ASP.NET. Estoy pensando en tener un solo proceso con un hilo que trate con cada conexión de cliente. Memoria compartida entre hilos en lugar de una base de datos.

He leído un poco sobre la versión de HttpListener de Microsoft y cómo funciona con el controlador Http.sys. Por desgracia, la documentación de Mono en esta clase es solo la interfaz de clase automatizada sin discusión de cómo funciona bajo el capó. (Linux no tiene Http.sys, así que me imagino que se ha implementado de manera sustancialmente diferente.)

¿Alguien podría indicarme algunos recursos para discutir este módulo, por favor?

Muchas gracias, Bill, billpg.com

(Un poco de historia a mi pregunta para el interesado.)

Hace algún tiempo, me preguntó this question, interesado en mantener una larga conversación abierta con una gran cantidad de de ida y vuelta. Me había decidido por el diseño de mi propio protocolo ad-hoc, pero las personas con las que hablé realmente querían una interfaz REST, incluso a costa de la señal "Bien, envía tu comando ahora".

Entonces, me preguntaba si ejecutar ASP.NET en un servidor Linux/Mono, pero tropecé con HttpListener. Esto parecía ideal, ya que cada "conversación" podía ejecutarse en un hilo separado. El hilo que llama a HttpListener en un bucle puede buscar para qué hilo es cada conexión entrante y pasar la referencia a ese hilo.

La alternativa para un servicio impulsado por ASP.NET, sería tener el código ASPX recogiendo el estado de una base de datos, y volver a escribir el nuevo estado cuando termine. Sí, funcionaría, pero eso es mucho sobrecargado.

+0

me gustaría empezar aquí: http://www.koders.com/csharp/fidD8A53577DCD929265B6FE7D3B483FE38655DFDCF.aspx –

+0

@MauricioScheffer - Su enlace no parece funcionar. –

Respuesta

24

Saludos, La clase HttpListener en Mono funciona sin ningún problema. Creo que la diferencia más significativa entre su uso en un entorno MS y un entorno Linux es que el puerto 80 no se puede vincular sin una seguridad raíz/su/sudo. Otros puertos no tienen esta restricción. Por ejemplo, si especifica el prefijo: http://localhost:1234/, HttpListener funciona como se esperaba. Sin embargo, si agrega el prefijo http://localhost/, que esperaría escuchar en el puerto 80, falla silenciosamente. Si intenta explícitamente vincularse al puerto 80 (http://localhost:80/), lanza una excepción.Si invoca su aplicación como superusuario o raíz, puede vincularse explícitamente al puerto 80 (http://localhost:80/).
Todavía no he explorado el resto de los miembros de HttpListener con suficiente detalle como para hacer comentarios útiles sobre cómo funciona en un entorno Linux. Sin embargo, si hay interés, continuaré publicando mis observaciones.

chickenSandwich

+6

Puede 'sudo setcap 'cap_net_bind_service = + ep'/usr/local/bin/mono-sgen' para habilitar puertos <1024 sin derechos de superusuario. Asegúrese de verificar si la ruta 'mono-sgen' es correcta para usted antes de ejecutar el comando. –

+0

Funcionó bien para mí hasta hoy:/ahora recibo conexiones persistentes en el estado fin_wait2 pero probablemente no esté relacionado con la actualización mono –

2

No estoy seguro de por qué quieres ver tan profundamente en el capó. Incluso en el lado de Microsoft, los documentos sobre http.sys pueden no proporcionarle información realmente valiosa si está utilizando .NET Framework.

Para saber si algo funciona en Mono lo suficientemente bueno, se supone que siempre debe descargar su imagen de VMware o VPC, y probar sus aplicaciones en él.

http://www.go-mono.com/mono-downloads/download.html

Aunque Mono es mucho más maduro que hace unos años, no podemos decir que ha sido probado por un número suficiente de aplicaciones del mundo real, como Microsoft.NET. Por lo tanto, pruebe sus aplicaciones y envíe los problemas que encuentre al equipo de Mono.

De acuerdo con mi experiencia, los problemas menores se resuelven en unos pocos días, mientras que para problemas importantes lleva más tiempo. Pero con el código fuente de Mono disponible, puede solucionarlo por su cuenta o descubrir buenas soluciones la mayor parte del tiempo.

+0

Muchas gracias Lex. Estaba esperando que la versión de Microsoft de la biblioteca abra un socket-listen y realice un análisis de encabezado. No esperaba un módulo kernel ejecutándose en el anillo 0. Si la versión de Mono también usa un módulo kernel, informará sobre cualquier decisión de ingeniería que deba tomar. – billpg

+0

Http.sys aparece por primera vez en Windows Server 2003 para mejorar el rendimiento y proporcionar nuevas funciones. Pero no cambia la API HttpListener, ¿verdad? HttpListener todavía funciona en Windows XP donde http.sys no existe. Esto también se aplica a Mono, donde el sistema operativo subyacente puede tener o no un módulo http.sys por igual. Hasta donde yo sé, en tal caso, el equipo Mono intenta proporcionar muchos backends y uno de ellos será recogido en tiempo de ejecución en función de los sistemas operativos/módulos que detecte. Vea este caso similar, "¿Cuáles son los problemas con FileSystemWatcher?" en http://www.mono-project.com/FAQ:_Technical –