Monday, May 21, 2007

C# Mono HTTP Server

Hace tiempo habia creado un servidor Http en C# y Mono siguiendo la arquitectura de Isolated Applications de Asp.net, lo he desempolvado para poder utilizarlo en para lo que finalmente lo habia necesitado, mi framework de aplicaciones. Lo hice hace como 1 año atras: Soporta:
  • Application Tree
  • Isolated Applications Activation
  • Application State(Offiline,Online)
  • Cookies
  • MimeTypes
  • KeepAlive
  • Buffering
  • Encodings
  • Http Redirection
  • Http Resources Tree
  • Http Resources Activation
  • Exception Handling(Local,Remote information)
  • Port Publication.
  • SSL(con algunos bugs fantasmas)
En perfomance esta bastante aceptable, realice unas pruebas de carga con Firefox y unos script con autorefresh y pude calcular calcule 20 clientes(20 pestañas de firefox) respondiendo a 150ms cada solicitud de 672 KB fijos, 34MB de memoria de consumo de proceso de servidor y 73%(compartido con firefox) de mi procesador Pentium4 2.8Ghz. Puede que no sea el benchmark mas perfecto pero algo es algo, despues de darme cuenta de que podia hacer mi framework incluyendo sus 5 servidores completamente en C# desisti y ataque otro problema para el momento. Ahora es tiempo de reescribirlo para implementar todo esto:
  • SessionState
  • ApplicationState
  • Resources Pooling
  • Authorization
  • Authentication
  • Server/Client Buffering
  • Mutexes
  • Caching
  • Configuration File Directory Dependendy(Depende de AppDomain.SetConfigurationBytes que aun no esta implementado en Mono)
  • Virtual Relative/Absolute Paths checking.
Tambien hay que rediseñar todo esto:
  • Server/Application Buffering: Eliminar el hashtable de solicitudes y utilizar Pipelined Streams(un 10% de adicional de perfomance)
  • Reemplazar el parsing del HTTP Header un Regex.(un 2% adicional de perfomance)
  • Process Isolation and Application Pooling
  • Statistics
  • Host Naming
  • SSL: Implementar PKI.
En fin es un arduo trabajo, hasta el momento la api esta sencilla: BinDeal.Foundation.Net.Http.Server.HttpServer server = new BinDeal.Foundation.Net.Http.Server.HttpServer("BinDeal-WebServer"); server.Publications.Register( new HttpServerPublication( new HttpStandardEndPoint(8089), null, true, System.Net.IPAddress.Any, int.MaxValue)); HttpApplicationSetup setup = new HttpApplicationSetup(); setup.ApplicationName = "DefaultApp"; ApplicationDebugParams prms = new ApplicationDebugParams(); prms.Enabled = true; setup.Debug =prms; setup.EntryPointTypeName = typeof(FileBrowserAppEntry).AssemblyQualifiedName; HttpWebApplication webApp = new HttpWebApplication(setup); server.Applications.SetRoot(webApp.IdResource); webApp.TakeOnline(); server.Start(); Aqui les coloco algunos screenshots de una pequeña aplicacion web para explorar mis archivos de la PC.

3 comments:

jesus garcia said...

amigo una disculpa tengo que desarollar un mini servidor http y la verdad no tengo ni idea de como empezar, nme podrias hechar una mano? saludos y gracias desde mexico

jesus garcia said...

hola amigo me podrias ayudar es que tengo un proyecto final de semestre de desarrollar un mini servidor http pero no tengo ni idea, me podrias orientar saludos desde mexico.

Johan Hernandez said...

Jesus, escribeme a mi correo.