OWIN, Katana y open source projects

De seguro que al sol de hoy ya has oído hablar sobre la especificación OWIN — Open Web Server Interface for .NET y sobre la implementación de esta especificación por parte de Microsoft en el proyecto Katana, ya se ha escrito bastante sobre el tema y para los hispanohablantes ya el buen Eduard Tomas hizo una reseña de como ha venido evolucionando ASP.NET y su visión de una futura evolución no monolítica del Framework.

En pro de la flexibilidad y la portabilidad

En la actualidad en .net tenemos varios Frameworks para desarrollo web, unos de Microsoft (WebForms, MVC y Web API) y unas opciones open source como FubuMVC, OpenRasta, NancyFX, entre otros. Con estos Frameworks desarrollamos nuestras aplicaciones, y para que puedan “correr” empleamos hosts y servidores Web, como el poderoso IIS, el IIS Express o algún tipo de Self Hosting empleando un HttpListener/TCP Listener/Web Socket. Y aquí es donde surge la principal meta de la especificación OWIN, desacoplar servidor y aplicación.

OWIN describe como los componentes de un Http pipeline deben comunicarse, para esto emplea dos componentes principales, el primero es el entorno, este es un diccionario de la forma IDictionary que llenará el servidor compatible con OWIN con los datos de entorno, con las claves que se detallan en la especificación. Y la responsabilidad de actualizar este diccionario con nuevos valores y de escribir el response body será entonces del Framework o la aplicación.

El segundo componente es el Application Delegate, esta será la abstracción principal entre todos los componentes de una aplicación, tomando el diccionario de entorno y definiendo una tarea a realizar, su firma es de la forma Func, Task>. Como se puede notar, el que la tarea a realizar sea una Task ya nos hace ver una prometedora asincronia :D.

Con estas simples abstracciones podemos escribir componentes que cumplan la especificación y “encadenarlos”  con otros componentes, reemplazar nuestro web server por uno mas ligero o robusto, emplear el host que mejor se ajuste, tener componentes mas granulares para la autenticación p. ej. y así tener lo que necesito y como lo necesito, sin ninguna dependencia extra, dándonos no solo las ventajas de poder reemplazar los componentes mas fácilmente, sino una posible mejora en el performance, pues como digo, solo usas los componentes que necesitas. Además, como estos componentes no dependen el uno del otro podríamos fácilmente encontrar un host para Mono y movernos hacia allá sin tener que reemplazar/cambiar nada/ningún componente.

A diferencia de un todo, esta modularidad nos brinda la ventaja de poder evolucionar constantemente cualquiera de nuestros componente sin tener que realizar, me atrevería a decir que, ningún trabajo en los demás.

Katana

La especificación de OWIN es dirigida por la comunidad de desarrolladores de .net, un esfuerzo conjunto de la comunidad de usuarios para presentar una nueva forma de hacer las cosas. La implementación de esta especificación por parte de Microsoft lleva el nombre de KATANA, una serie de componentes de OWIN, el proyecto es open source,  e incluye componentes de infraestructura como servidores y hosts, componentes para autenticación, Frameworks como SignalR y Web API.

El como implementar Katana ya es un tema muy documentado, así que no profundizare en este aspecto.

Open source projects

Cuando leía esta fascinante iniciativa lo primero que se me vino a la mente fue… escribiré mi propio servidor con juegos de azar y mujerzuelas, es muy sencillo 😛

        static void Main(string[] args)
        {
            const string msg = "Hola, yo soy tu server";
            const int port = 1450;
            var server = new TcpListener(IPAddress.Any, port);
            server.Start();
            Console.WriteLine("Servidor en linea...");
            while (true)
            {
                var socket = server.AcceptSocket();
                byte[] responseMessage = Encoding.ASCII.GetBytes(msg.ToCharArray(), 0, msg.Length);
                socket.Send(responseMessage);
                socket.Disconnect(false);
            }
        }

image

Pero ok, mejor olviden mi propia implementación y los juegos de azar, mejor olvídenlo todo y veamos verdaderas implementaciones hechas por la comunidad.

NOWIN

El primer proyecto de código abierto que clone fue NOWIN, según el autor, su implementación es de dos a tres veces mas rápida que HttpListener (paff sencillo) y Node JS (esto son palaras mayores :P). Implementar una aplicación con Nowin es bastante sencillo (En el código fuente  esta el mismo ejemplo):

    class Program
    {
        static void Main(string[] args)
        {
            var builder = ServerBuilder.New().SetPort(1450).SetOwinApp(Sample.App);
            using (builder.Start())
            {
                Console.WriteLine("Listening on port 1450. Enter to exit.");
                Console.ReadLine();
            }
        }
    }
    public class Sample
    {
        public static Task App(IDictionary arg)
        {
            var req = new Owin.Types.OwinRequest(arg);
            var resp = new Owin.Types.OwinResponse(req);
            if (req.Path == "/")
            {
                resp.StatusCode = 200;
                resp.AddHeader("Content-Type", "text/plain");
                resp.Write("Hello World!");
                return Task.Delay(0);
            }
            var p = Path.Combine(@"c:\Aplicacion", req.Path.Substring(1));
            if (File.Exists(p))
            {
                resp.StatusCode = 200;
                resp.AddHeader("Content-Type", "text/html");
                return resp.WriteAsync(File.ReadAllBytes(p));
            }
            resp.StatusCode = 500;
            return Task.Delay(0);
        }
    }

Lo que necesité:

image

Como luce:

image

Empleando Katana – Microsoft Hosting

En el ejemplo anterior con nowin no había una clara distinción del host y el server, pues cumplía el mismo objetivo. Veamos ahora una implementación con un componente de Katana, Microsoft.Owin.Hostin, es decir, no estamos haciendo uso de todos los componentes de katana, solo de lo que necesito! porque yo ya tengo mi server!… no es genial?! empleemos además un Web Api como framework, simplemente buscamos el Web Api OWIN en nuget y lo instalamos. Los paquetes en este ejemplo:

image

El código:

    class Program
    {
        static void Main()
        {

            var options = new StartOptions();
            options.Port = 1450;
            options.ServerFactory = "NowinWebServer";
            using (WebApp.Start(options))
            {
                Console.Write("Server en linea, puerto : {0}", options.Port);
                Console.ReadKey();
            }
        }
    }
    public class HolaMundoController : ApiController
    {
        public string Get()
        {
            return "Hola!!";
        }
    }
    public class Startup
    {
        public void Configuration(IAppBuilder builder)
        {
            var config = new HttpConfiguration();
            config.Routes.MapHttpRoute("Default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
            builder.UseWebApi(config);
        }
    }

El resultado:

image

Y la mejor parte de todas es que no hay espacio a resultados mágicos inesperados! te puedes descargar los fuentes de Katana y ver que pasa tras la cortina.

Como Nowin, he visto una implementación de  Mark Rendle llamada Flux un server para .net y mono que no usa HttpListener o Fleck una implementación de Web Socket server. Todas disponibles para jugar su uso.

Hay además implementaciones de Frameworks como el buen NancyFX y SignalR, tenemos componentes independientes de autenticación en el mismo proyecto Katana, que si al ver su código no te gustan, bien puedes mejorarlas y contribuir al proyecto o buscarte el que mejor se acomode a tus necesidades entre varias posibles opciones de la comunidad.

Opinión

Como yo lo veo con esto se marca un nuevo rumbo para el desarrollo Web (bueno me uno a Eduard y digo que no solo Web!) en .net, no solo por las ventajas que iniciativas como OWIN en si mismas proponen, sino por algo que ha ido evolucionando mucho en nuestra comunidad (.net) este tipo de cosas son muy normales en node js por ejemplo, donde hay varias opciones que puedes buscar en internet para resolver afrontar problemas, si pones npm “x cosa” en el buscador habrá al menos un loco en el mundo que ha subido un paquete que puedes descargarte y emplear para resolver tu problema. Para muchos desarrolladores de una plataforma tan robusta como lo es .NET esto también se ve como  un arma de doble filo, pues puede que ahora nos llenemos de millones de paquetes basura compatibles con OWIN que saber cual escoger se haga una tarea muy complicada (de hecho esto si pasa en node) o simplemente existan muchos paquetes con un mínimo de documentación… en fin, estos son skills que hacen que una comunidad sea fuerte, contribuir en proyectos open source no siempre es solo escribir código nuevo, se puede ayudar con implementaciones existentes, dando feedback o documentando.

Para quienes escribimos software corporativo y que aun no implementamos en producción nada fuera de un robusto IIS, pues repito, esto no supone el fin de IIS / System Web, para NADA! podemos tomar un IIS como nuestro hosting con KATANA, seleccionar los middlewares que necesitamos y los Frameworks a emplear con el mismo poder de siempre. De hecho en proyectos con VS2013 Preview ya vemos implementaciones con Katana 😀

El tema del licenciamiento es algo que me llama mucho la atención, si estas iniciativas buscan una mejora constante y hace énfasis en la portabilidad no emplees en tus aportes cosas como la que había hecho Microsoft con Katana! que había indicado (como en muchos otros paquetes de Nuget) una Windows-only Restriction, por fortuna anunció que en la versión 2, la que estará con VS2013 ya no tendrá esta restricción.

Entre colegas he visto muy parcializadas las opiniones frente a este tema, algunos alegan que nada es perfecto y querer hacer .net mas parecido a otros no es bueno… en fin, Microsoft parece no estar rompiendo nada hacía atrás y con iniciativas como esta, que repito, es de la misma comunidad de usuarios, se empiezan a dar mayores opciones, mas herramientas que podemos escoger para resolver nuestros problemas.

Si tienes alguna opinión sobre el tema no dudes en dejar tu comentario.

Bien, por ahora dejo el tema hasta aquí, ha sido un post teórico-practico-opinión, como para organizar un poco las ideas que esto trae y como lo veo yo, mas adelante espero escribir mas centrado en Katana, sus middlewares y la interacción con productos de la comunidad. 😀

Hasta el próximo post

Anuncios
OWIN, Katana y open source projects

2 comentarios en “OWIN, Katana y open source projects

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s