Hola que tal?, en esta serie de Post me voy a enfocar de una manera práctica a este nuevo “bicho” que está apareciendo, y que se va a quedar por un buen rato, que es OWIN. Si no sabes lo que es, te recomiendo que leas los siguientes Links antes de seguir:
- http://geeks.ms/blogs/etomas/archive/2013/07/15/katana-cortando-el-framework.aspx
- http://www.variablenotfound.com/2013/10/owin-y-katana-v-middlewares.html
Bueno, asumo que ya los leíste, si no, voy a hacer un pequeño resumen de por que es necesario una implementación de este tipo, y la justificación no es inventada por mí, si no voy a escribir lo que dice el Team de ASP.NET.
ASP.NET ha estado presente aproximadamente 10 años, y sin duda a permitido la creación de muchas y muy buenas web apps, (Sitios y Servicios). Pero ya las estrategias de desarrollo han evolucionado, y si bien ASP.NET Web API y MVC responden a esta evolución de excelente manera, hay que dar un paso más en esta evolución, es aquí donde aparece el proyecto Katana, el cual proporciona un conjunto de componente para las aplicaciones ASP.NET que le permite ser flexible, ligero, portátil y proporcionar un mejor rendimiento, todo esto pensado para la nube.
Luego de haber leído los artículos anteriores, se nos viene a la cabeza de inmediato node.js, que llamó la atención de inmediato con la sencillez de este framework para crear y ejecutar un servidor web. Bueno, los objetivos de katana se enmarcan a la luz de Node.js, no hay misterio ni problemas al reconocerlo,resumir que Katana trae mucho de los beneficios de Node.js sin forzarnos a los desarrolladores, tirar todo lo que ya sabemos de las aplicaciones con ASP.NET. Entonces la idea es que empezar con el proyecto Katana debe ser igual de fácil que introducirse en Node.js.
Vamos a comenzar con el código, y verás, al igual que tú , estoy aprendiendo, así que espero que nada resulte a la primera, ya que encuentro de mucha utilidad, aprender de los errores.
Luego debemos instalar el paquete de Microsoft.Owin.Host.SystemWeb, el cual nos proporciona un servidor OWIN que ejecuta las canalizaciones de solicitudes de ASP.NET (si no tienes claro esto, insisto, lee los artículos )
Se van a instalar dependencias como la Microsoft.Owin, que provee helpers y métodos para desarrollar aplicaciones OWIN. Podemos utilizar estos helpers para crear rápidamente un servidor que responda “Hola Mundo”. Vamos a crear una clase y se llamará Startup, puedes notar que se instaló un template:
Con lo cual nos crea la estructura básica y le vamos agregar un poco más de código:
using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(Demo1.Startup))]
namespace Demo1
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Run(context =>
{
context.Response.ContentType = «text/html»;
return context.Response.WriteAsync(«<h1> Hola Mundo!!</h1>»);
});
}
}
}
Al ejecutarlo tendremos el siguiente resultado:
Y si, igual de sencillo que Node.js, pero sigamos avanzando. Una de las máximas de OWIN es que exista una des acoplamiento de componentes como el IIS, es decir, al contrario del ejemplo anterior, que ocupamos la canalización de request de ASP.NET, el cual se soporta en System.Web. Esto de todas maneras no es para nada malo, de hecho añade un gran valor, ya que nos permite tener la flexibilidad y composición de pipeline de OWIN combinado con las capacidades de gestión y madurez de IIS. Pero hay otros escenarios, en donde no es necesario IIS, por ejemplo , es posible que necesitemos que un servicio del SO tenga una puerta escuchando peticiones Web para configuración , y no queremos tener montado un IIS o un apache solo para eso, si no que el mismo servicio sea el host.
Pasar de portar el host desde IIS a una app de linea de comandos, vamos a requerir agregar un nuevo paquete nuget con el servidor y sus dependencias para iniciar el host bajo esta modalidad. Para esto vamos a tener nuestro servidor en un host Katana llamado OwinHost.exe, y utilizaremos un HTTPListener basado en Katana. Paso siguientes entonces en crear una app de consola y agregar los paquetes correspondientes:
Agregamos una clase de partida quedando así:
using Microsoft.Owin.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace KatanaDemo2
{
class Program
{
static void Main(string[] args)
{
using (WebApp.Start<Startup>(«http://localhost:8888»))
{
Console.WriteLine(«Presiona una tecla para detener al server»);
Console.ReadKey();
}
}
}
}
Con esto le estamos diciendo, que escuche los requerimientos por el puerto 8888 de servidor, en este caso mi equipo. Como puedes apreciar , no hay ninguna referencia hacia System.Web. La clase startup es exactamente igual que el escenario anterior, lo probamos y listo!
Y esto es solo el inicio, vamos a crear ejemplos mucho más sofisticados, como ves es un cambio grande pero necesario en términos de arquitectura. Así que nos iremos paso a paso.
Espero que te sirva!
Nos vemos @chalalo.