Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 24 de septiembre de 2013
Combates con KatanaHasta ahora hemos dedicado mucho tiempo a explicar la filosofía y conceptos que rodean a OWIN y Katana. Pero como todos los alumnos de este tipo de artes, seguro que estáis ansiosos por saltar al tatami por primera vez y comenzar a hacer alguna prueba que demuestre que todo este esfuerzo vale la pena.

Pero antes de continuar, permitidme que os recuerde los anteriores artículos de la serie:
En esta ocasión vamos a implementar un par de ejemplos completos paso a paso para que veáis Katana en funcionamiento y podáis comenzar a pelearos con ella. Y lucharemos en dos dojos distintos: una aplicación de consola con self-hosting, y una aplicación web.

1. Dojo: Aplicación de consola

1.1. Preparativos e infraestructura básica

En primer lugar, creamos una aplicación de consola llamada “KatanaConsoleDemo” y vamos siguiendo los pasos descritos a continuación.

Instalamos en el proyecto el siguiente paquete Nuget, que permitirá que el propio proceso de consola actúe como Host de nuestra aplicación utilizando listeners de .NET para atender las peticiones. Por esta razón este tipo de alojamiento se denomina self-hosting: es el propio proceso el que hospeda los componentes de servidor y es el modelo a utilizar cuando queremos prestar servicios desde aplicaciones independientes de ASP.NET/IIS, como servicios Windows, roles de Azure, aplicaciones de consola, etc.

Ojo, que mientras estos paquetes sigan en beta, no olvidéis añadir a las líneas un “-pre” para que se incluyan las versiones pre-release:
PM> Install-Package Microsoft.Owin.Host.HttpListener
A continuación, instalamos el siguiente paquete, que ofrece, entre otras cosas, un componente de servidor que podemos iniciar desde nuestro Host:
PM> Install-Package Microsoft.Owin.Hosting
Y por último, hacemos lo mismo con el siguiente paquete, que aporta algunos módulos interesantes para el diagnóstico de sistemas OWIN:
PM> Install-Package Microsoft.Owin.Diagnostics

1.2. Configuración del pipeline

Creamos ahora un archivo Startup.cs, con el siguiente contenido, que será nuestra clase de configuración:
using Microsoft.Owin.Diagnostics;
using Owin;

namespace KatanaConsoleDemo
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var options = new WelcomePageOptions() {Path = "/welcome"};
            app.Use<WelcomePageMiddleware>(options);
        }
    }
}
Observad que estamos añadiendo al pipeline un único módulo, llamado WelcomePageMiddleware. Este middleware, definido en Microsoft.Owin.Diagnostics, procesa las peticiones destinadas a la URL que indicamos en sus opciones “/welcome” y retorna una página de bienvenida. Las peticiones que sean dirigidas a otras direcciones, las dejará pasar para que sean procesadas por otras peticiones.

1.3. Inicio del servidor

A continuación, introducimos en Program.cs el siguiente código, el punto de entrada de la aplicación de consola, que arrancará el servidor en la dirección http://localhost:8888 y permanecerá a la escucha hasta que se pulse una tecla:
using System;
using Microsoft.Owin.Hosting;

namespace KatanaConsoleDemo
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            using (WebApp.Start<Startup>("http://localhost:8888"))
            {
                Console.WriteLine("Press a key to stop server");
                Console.ReadKey();
            }
        }
    }
}
Como se puede intuir, el servidor arranca al llamar WebApp.Start(). Observad que mediante argumento genérico estamos indicando que la clase que implementa la configuración de nuestra aplicación se llama Startup, aunque por supuesto podría tener cualquier nombre. Por convención, se intentará ejecutar el método Configuration() –que es justo el que hemos implementado anteriormente-, aunque se puede cambiar por otro usando distintas sobrecargas de WebApp.Start().

Y esto es todo lo que necesitamos para que nuestra aplicación de consola sea capaz de responder peticiones realizadas al servidor local en el puerto 8888.

Desde un navegador podemos acceder a la dirección “/welcome y aparecerá la siguiente página, demostrando que Katana está en funcionamiento y que el módulo middleware ha capturado y procesado la petición correctamente:

image
En cambio, si accedemos a otra dirección cualquiera como “/” o “/something”, obtendremos un error 404: ningún módulo ha procesado la petición.

1.4. Simplificando la configuración: extensores de IAppBuilder

Recordaréis que un poco más arriba hemos configurado el pipeline de la aplicación de la siguiente forma:
public void Configuration(IAppBuilder app)
{
    var options = new WelcomePageOptions() { Path = "/welcome" };
    app.Use<WelcomePageMiddleware>(options);
}
Esto es totalmente válido y correcto, pero es interesante saber que hay una fórmula más rápida para hacerla. Normalmente, los middlewares vienen acompañados de métodos extensores para el interfaz IAppBuilder, de forma que podemos introducirlos en el pipeline de forma más directa. En este caso, el código anterior podríamos sustituirlo por:
public void Configuration(IAppBuilder app)
{
    app.UseWelcomePage("/welcome");
}
Normalmente utilizaremos esta última manera, puesto que es más rápida y, lo que es mejor, fácilmente descubrible gracias a intellisense, que mostrará sobre la ayuda sobre todas las extensiones soportadas. Todas ellas se definen en el namespace Owin y siguen una convención más o menos homogénea en su nombrado, por lo que aparecerán de forma directa. Obviamente, aparecerán más opciones cuantos más paquetes de módulos OWIN hayamos incluido en nuestro proyecto:

Intellisense mostrando extensores sobre IAppBuilder

2. Dojo: Aplicación web

Cambiamos de Dojo, y vamos combatir ahora en un entorno ASP.NET/IIS. Dado que OWIN proporciona independencia de aplicaciones respecto a Servers y Hosts, tanto la configuración como los módulos usados serán idénticos a los vistos anteriormente.

Cambia, eso sí, en que en este caso no será necesario arrancar el servidor puesto que usaremos el adaptador de ASP.NET/IIS para aplicaciones OWIN, y será esa pareja la encargada de actuar como Host y Server.

2.1. Preparativos e infraestructura básica

Creamos una aplicación web vacía (plantilla Empty Web Application de Visual Studio) e instalamos el componente de hosting sobre ASP.NET/IIS para aplicaciones OWIN:
PM> Install-Package Microsoft.Owin.Host.SystemWeb
A continuación, hacemos lo propio con el siguiente paquete de extensiones que ya hemos utilizado anteriormente:
PM> Install-Package Microsoft.Owin.Diagnostics
Creamos también una página Web Forms de inicio con cualquier contenido, a la que llamamos Default.aspx. Será la página de inicio de nuestra aplicación web:
<%@ Page Language="C#" AutoEventWireup="true"  %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        Hello world!
    </div>
    </form>
</body>
</html>

2.2. Configuración del pipeline

De forma similar a como hicimos anteriormente, necesitamos un código de inicialización, por lo que añadimos la siguiente clase al proyecto. En ella, instalamos en el pipeline el ya conocido módulo WelcomePageMiddleware disponible en el paquete Diagnostics, con un código idéntico al usado en la aplicación de consola:
using Owin;

namespace KatanaWebDemo
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseWelcomePage("/welcome");
        }
    }
}
Estamos siguiendo la convención a rajatabla: la configuración se implementa en el método Configuration() de la clase Startup disponible en el espacio de nombres raíz de la aplicación. Por supuesto, esta convención puede ser adaptada a nuestras preferencias y modificar el nombre de la clase, el método, o el espacio de nombres; en un artículo posterior veremos cómo.

2.3. ¡Ejecutamos!

En este caso no será necesario arrancar un Server, Host, ni nada parecido: ya están en funcionamiento. Son ASP.NET e IIS los que ocupan estos roles, por lo que directamente podremos ejecutar nuestra aplicación.

El contenido que aparecerá inicialmente en nuestro navegador es el introducido en Default.aspx. La petición dirigida a la dirección “/” ha atravesado la cadena de middlewares (en la que sólo hay un módulo) y ninguno la ha procesado, por lo que se ha delegado su gestión a ASP.NET, que es el que está retornando el resultado:

Página inicial

En cambio, si accedemos a “/welcome”, tendremos la página de bienvenida de Katana. El módulo WelcomePageMiddleware ha capturado la petición y la ha procesado por completo, impidiendo que la petición continúe viajando por el pipeline:

Página de bievenida de Katana

3. Lecciones aprendidas en el combate

Tras estas dos primeras incursiones prácticas en el mundo OWIN/Katana son, hemos podido comprobar que las aplicaciones, módulos y código de configuración son totalmente independientes del tipo de hosting elegido. Virtualmente podemos ejecutar nuestros sistemas en cualquier sitio sin tocar una línea de código; y si hemos estructurado bien nuestros proyectos, podríamos hacerlo incluso sin recompilar.

Hemos visto también el uso de Nuget para incluir en nuestro proyecto justo los módulos que necesitamos. Ni uno más, ni uno menos. Esto permitirá que nuestro servidor sólo pierda el tiempo en cosas que hemos considerado importantes para nuestra aplicación al añadirlas explícitamente al pipeline.

Y una última conclusión interesante: usar Katana es muy fácil :-)

En los siguientes artículos de la serie seguiremos profundizando en el uso y funcionamiento de Katana. Queda menos para convertirnos en maestros ;-)

Publicado en Variable not found.

2 Comentarios:

Carlos Díez dijo...

Muy clarito todo, como siempre, esperamos los siguientes posts.
Gracias por el curro!!!

josé M. Aguilar dijo...

Gracias, Carlos :)

Seguiremos en ello!