OWIN (Open Web Interface for .NET) es una nueva especificación abierta definida por miembros del propio grupo de
Asp.Net, cuya finalidad es desacoplar la dependencia entre el host de la aplicación web, y la propia aplicación. ¿Qué ha llevado a la necesidad de la especificación
OWIN? Para responder a la pregunta, es necesario hacer una pequeña retrospección a la evolución de la plataforma
Asp.Net.
Un poco de historia de Asp.Net
En el año
2002 nace
Asp.Net, integrada en la primera versión de
.Net Framework. Esta nueva tecnología mantuvo gran similitud con su antecesor, el clásico
ASP, para no provocar un cambio completo en la forma en la que los desarrolladores construían sus aplicaciones. Además optó por el camino de lo que llamaron
WebForms, formularios que se construían de una manera muy similar a como se hacía para aplicaciones escritorio (
WinForms), y así atraer a los desarrolladores desktop hacia la web.
Durante varios años
Asp.Net fue evolucionando de manera paralela a como lo hacía el propio
.Net, ya que estaba completamente atado a éste por ser un
framework monolítico. Todo
Asp.Net se apoyaba en
System.Web, que es parte del
framework.
Entre
2007 y
2008 surge
Asp.Net MVC, un
framework de desarrollo web no orientado a
Webforms, sino utilizando la arquitectura
Modelo-Vista-Controlador. Además del cambio de filosofía que esto provocó, este
framework no se incluía en el monolito
.Net Framework, lo que permitía una evolución completamente independiente. Pero su ejecución seguía dependiendo de
System.Web, por lo que la única manera de alojar una aplicación web basada en tecnología
Microsoft, era a través de su servidor web,
Internet Information Services (IIS). En este momento se empieza a ver la problemática que provoca todo el acoplamiento existente entre la aplicación web,
.Net framework, y el host de aplicaciones.
Junto con la liberación de
MVC4 surge
Web API, una nueva
API de desarrollo de aplicaciones web, pero esta vez sí, sin ningún tipo de dependencia sobre
System.Web.dll. Y para marcar más esta independencia, se incluye un
self-host para hospedar estas nuevas aplicaciones sin necesidad de
IIS.
El nacimiento del Open Web Interface for .NET y Katana
Así, con todo lo aprendido durante la evolución de
Asp.Net, y basándose en la filosofía de
Web API, nace
OWIN para crear la mayor independencia posible entre los componentes de un desarrollo web. Por tanto, la arquitectura para una aplicación
OWIN queda de la siguiente manera:
• Host: Proceso del sistema que recibe toda la comunicación Http. (IIS, servicio Windows….)• Server: Implementación del protocolo Http que se encuentra alojado en el Host. Las peticiones son gestionadas según marca la definición OWIN.• Middleware: Son los componentes que reciben las peticiones del server con el formato OWIN para procesar (o no) una respuesta. Estos componentes se ejecutan de manera encadenada en una pipeline, y evidentemente, tienen funcionalidades diferentes. A cada componente se le dotará de una funcionalidad concreta, pudiendo “romper” la cadena de ejecución para retornar un valor concreto al cliente en el caso de que así se desee, o continuar la ejecución hacia el siguiente componente.• Application: La propia aplicación web, construida apoyándose en los frameworks que se consideren oportunos (y compatibles con la definición Owin), como por ejemplo MVC o Web API.
 |
| Figura 1: Componentes de la arquitectura OWIN |
Como se ha citado anteriormente,
OWIN no es más que una especificación, y es aquí donde entra
Katana, la implementación (una de ellas) de este estándar, que ofrece toda la funcionalidad de
OWIN mediante
Clases y
Helpers para el manejo de peticiones y creación de respuestas
HTTP.
Creando una primera aplicación
Una vez vista la teoría y con la nueva arquitectura en mente, ya se puede comenzar con el desarrollo de la aplicación.
1. Se crea un nuevo proyecto con la plantilla de aplicación
Asp.Net vacía.
 |
| Figura 2: Creación de una aplicación Asp.NET vacia |
2. Mediante el gestor de paquetes
nuget, se instalan los paquetes de
Katana en el proyecto, todos pertenecientes al namespace
OWIN:
• Install-Package Microsoft.Owin.Host.SystemWeb
• Install-Package Owin.Extensions
• Install-Package Microsoft.Owin.Diagnostics
 |
| Figura 3: Instalación de los paquetes de Katana con nuget |
3. Se agrega una nueva clase al proyecto con nombre
Startup.cs. En ésta, se crea un método
void de nombre
Configuration, y un parámetro de tipo
IAppBuilder (del namespace
Owin). En el paquete
Owin.Diagnostics se incluye un método de extensión llamado
UseWelcomePage, creado especialmente para comprobar el correcto funcionamiento del proyecto.
 |
| Figura 4: Creando la clase Startup |
4. Una vez compilado el proyecto, al ejecutarse debería aparecer en el navegador la página
Welcome.
 |
| Figura 5: Welcome Page |
Como se puede observar hasta el momento, el objeto
app del método
Configuration contiene todo el contexto necesario de la petición y la respuesta
HTTP, que son los parámetros que los componentes
middleware se encargarán de utilizar. En este primer ejemplo, el
middleware WelcomePage se encarga de escribir y enviar la respuesta directamente, para cualquier petición que se realice. Indagando un poco más en el método, se ve cómo es posible utilizar este
middleware para un
path concreto, es decir, solo respondiendo a las peticiones que se realicen a un
path concreto.
 |
| Figura 6: middleware para el path Welcome |
Ahora la página welcome solo se mostrará para peticiones realizadas al
path /Welcome, mientras que para cualquier otra se mostrará un error
403. ¿Por qué ocurre esto? Básicamente porque se ha elegido
IIS como servidor, y en el caso de que ningún
middleware gestione la petición, ésta llegará a
IIS, y realizará el comportamiento que tenga asignado, en este caso mostrar el error de listado de directorio no permitido.
Ampliando la aplicación con la creación de nuevos middleware
Evidentemente lo útil de los componentes
middleware es crearlos según las necesidades de la aplicación, pudiendo delegar diferentes acciones a cada uno de ellos, como estadísticas, autenticación y respuesta final. De una manera rápida, se pueden crear
middleware apoyándose en expresiones
lambda (anónimas) pudiendo utilizar el contexto para analizar la petición y crear la respuesta, como se puede ver en el ejemplo:
 |
| Figura 7: Extendiendo el middleware |
Aunque para un primer acercamiento es suficiente, para la creación de componentes
middleware existe una
clase abstracta llamada
OwinMiddleware, que se puede implementar con la lógica que se le quiera otorgar. En este sencillo ejemplo, se van a crear tres componentes que se encargarán de crear la respuesta una vez estén anidados en el
pipeline.
 |
| Figura 8: Componiendo una respuesta con varios métodos |
Una vez definidos los
middleware propios, es suficiente con llamarlos (en el orden correcto) desde el método
Configuration utilizando el método genérico
Use tantas veces como
middleware se necesiten.
 |
| Figura 9: Componiendo la respuesta con la llamada a los métodos |
La respuesta desde el navegador a cualquier recurso de la aplicación debería ser como se muestra en la imagen:
 |
| Figura 10: Respuesta obtenida |
Y usar Latch en Asp.NET
Katana ofrece mucha más funcionalidad de la que se ha visto, pero esto es un pequeño acercamiento al nuevo rumbo por el que
Asp.Net quiere caminar, que además también se integra perfectamente con
Latch. El uso de
middlewares permite modularizar la aplicación web y minimizar las dependencias entre módulos, por lo que el reemplazo de una funcionalidad concreta solo supone el rediseño o reimplementación de un
middleware concreto. ¿Qué tal un
middleware cuya única finalidad sea comunicarse con el servicio
Latch, una vez comprobada la autenticación?
Esto no sería nada difícil de realizar, y habría que hacer un uso análogo al que se describe en este documento de 16 páginas que explica cómo integrar con el
SDK de .Net y/o el
plugin de
Latch para el
.Net Login en cualquier aplicación
Asp.Net que vayas a realizar.
Autor: Ioseba Palop
Software Engineer en Eleven Paths