ASP .Net Core Middleware

Middleware en ASP .NET Core

En esta entrada hablaremos acerca de los Middleware en ASP .NET Core

La definicion que microsoft usa es: Middleware es software que se sitúa entre un sistema operativo y las aplicaciones que se ejecutan en él. Básicamente, funciona como una capa de traducción oculta para permitir la comunicación y la administración de datos en aplicaciones distribuidas.

A veces, se le denomina “plumbing” (tuberías), porque conecta dos aplicaciones para que se puedan pasar fácilmente datos y bases de datos por una “canalización”.

El uso de middleware permite a los usuarios hacer solicitudes como el envío de formularios en un explorador web o permitir que un servidor web devuelva páginas web dinámicas en función del perfil de un usuario.

Algunos ejemplos comunes de middleware son el middleware de base de datos, el middleware de servidor de aplicaciones, el middleware orientado a mensajes, el middleware web y los monitores de procesamiento de transacciones.

Cada programa suele proporcionar servicios de mensajería para que aplicaciones diferentes puedan comunicarse usando marcos de mensajería como el Protocolo simple de acceso a objetos (SOAP), servicios web, transferencia de estado representacional (REST) y notación de objetos JavaScript (JSON).

Si bien todo el middleware desempeña funciones de comunicación, el tipo que elige una compañía depende del servicio que se va a usar y del tipo de información que debe comunicarse.

Puede tratarse de autenticación de seguridad, administración de transacciones, colas de mensajes, servidores de aplicaciones, servidores web y directorios.

El middleware se puede usar también para procesamiento distribuido con acciones que ocurren en tiempo real en lugar de enviar los datos para allá y para acá.

ASP .NET Core

Como el middleware es usado en diferentes contextos, esto puede traer confusión, en esta entrada veremos la definición de Middleware en ASP .NET CORE. En este contexto particular los middleware  son clases en c# que nos permiten manejar las solicitudes y respuestas HTTP.

Es decir, el middleware es capaz de determinar el flujo de la aplicación, elegir cuando y a cual componente pasar el request, procesar dicha solicitud para generar una respuesta.

El middleware es capaz de realizar las siguientes tareas:

  • Ejecutar cualquier código
  • Realizar cambios en la solicitud y objetos de respuesta.
  • Finalizar el ciclo de request/response
  • Invocar la siguiente función de middleware en la pila.
app.Run(async context => {
 await context.Response.WriteAsync(“Hola Mundo”);
});

En este caso, si la app solo tiene este middleware el retorno siempre será “Hola Mundo”, debido a que no se refiere a la siguiente pieza del middleware, en otras palabras, qué sigue después. Por instancia podría agregarse otro middleware que agregue un header a la respuesta previa.

app.Use(async (context, next) =>
{
 context.Response.Headers.Add("Author", "Unicorn");
 await next.Invoke();
});
app.Run(async context =>
{
 await context.Response.WriteAsync("Hey Listen ");
});

La canalización de solicitud de ASP.NET Core consiste en una secuencia de delegados de solicitud, llamados uno tras otro. El siguiente diagrama muestra el concepto. El hilo de ejecución sigue las flechas negras.

Orden de ejecución
Canalizacion de middlewares

Las aplicaciones sencillas solo tienen un delegado que maneja todos los Request. Este caso no se aplica una estructura real de pilas, en su lugar una función anónima es llamada para responder a cada Request HTTP.

public class Startup
{
   public void Configure(IApplicationBuilder app)
   {
     app.Run(async context =>
       {
         await context.Response.WriteAsync("Hola Mundo");
       });
   }
}

El primer delegado Run termina la secuencia.

Se puede encadenar varias solicitudes juntas con Use. El parámetro next representa el siguiente delegado de la secuencia. Se puede hacer un corto-circuito si no se usa el parámetro next. A continuación un ejemplo del uso de next.

public class Startup
{
   public void Configure(IApplicationBuilder app)
   {
       app.Use(async (context, next) =>
       {
           // Do work that doesn't write to the Response.
           await next.Invoke();
           // Do logging or other work that doesn't write to the Response.
       });

       app.Run(async context =>
       {
           await context.Response.WriteAsync("Hola desde el segundo delegado.");
       });
   }
}

Orden de Ejecucion de Middleware en ASP .NET Core

El orden en que los componentes del middleware son agregados en Startup.Configure, define la secuencia en la que estos serán invocados. El orden es crítico para tres aspectos muy importantes : Seguridad, rendimiento y funcionalidad.

El siguiente método Startup.Configure agrega componentes de middleware relacionados con la seguridad en el orden recomendado:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();

    // app.UseRequestLocalization();
    // app.UseCors();

    app.UseAuthentication();
    // app.UseSession();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

El siguiente método Startup.Configure agrega componentes de middleware para escenarios de aplicaciones comunes:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseAuthentication();
    app.UseSession();
    app.UseMvc();
}

Middleware Incorporados en ASP .Net Core

Middleware Descripción Orden
Autenticación Proporciona soporte de autenticación. Antes HttpContext.Userse necesita. Terminal para devoluciones de llamada OAuth.
Política de cookies Rastrea el consentimiento de los usuarios para almacenar información personal y aplica estándares mínimos para los campos de cookies, como securey SameSite. Antes del middleware que emite cookies. Ejemplos: Autenticación, Sesión, MVC (TempData).
CORS Configura el intercambio de recursos de origen cruzado. Antes de los componentes que usan CORS.
Diagnósticos Varios middlewares separados que proporcionan una página de excepción de desarrollador, manejo de excepciones, páginas de códigos de estado y la página web predeterminada para nuevas aplicaciones. Antes de los componentes que generan errores. Terminal para excepciones o que sirve la página web predeterminada para nuevas aplicaciones.
Encabezados reenviados Reenvía encabezados proxy a la solicitud actual. Antes de los componentes que consumen los campos actualizados. Ejemplos: esquema, host, IP del cliente, método.
Chequeo de salud Comprueba el estado de una aplicación ASP.NET Core y sus dependencias, como verificar la disponibilidad de la base de datos. Terminal si una solicitud coincide con un punto final de comprobación de estado.
Método HTTP Override Permite que una solicitud POST entrante anule el método. Antes de los componentes que consumen el método actualizado.
Redirección HTTPS Redireccionar todas las solicitudes HTTP a HTTPS. Antes de los componentes que consumen la URL.
Seguridad de transporte estricta de HTTP (HSTS) Middleware de mejora de seguridad que agrega un encabezado de respuesta especial. Antes de enviar las respuestas y después de los componentes que modifican las solicitudes. Ejemplos: encabezados reenviados, reescritura de URL.
MVC Procesa solicitudes con MVC / Razor Pages. Terminal si una solicitud coincide con una ruta.
OWIN Interoperabilidad con aplicaciones, servidores y middleware basados ​​en OWIN. Terminal si el Middleware OWIN procesa completamente la solicitud.
Caché de respuesta Proporciona soporte para el almacenamiento en caché de respuestas. Antes de los componentes que requieren almacenamiento en caché.
Compresión de respuesta Proporciona soporte para comprimir respuestas. Antes de los componentes que requieren compresión.
Solicitar localización Proporciona soporte de localización. Antes de la localización de componentes sensibles.
Enrutamiento de punto final Define y restringe las rutas de solicitud. Terminal para rutas coincidentes.
Sesión Proporciona soporte para gestionar sesiones de usuario. Antes de los componentes que requieren sesión.
Archivos estáticos Proporciona soporte para servir archivos estáticos y exploración de directorios. Terminal si una solicitud coincide con un archivo.
Reescritura de URL Proporciona soporte para reescribir URL y redireccionar solicitudes. Antes de los componentes que consumen la URL.
WebSockets Habilita el protocolo WebSockets. Antes de los componentes necesarios para aceptar solicitudes de WebSocket.

Para más información acerca de Middleware en ASP .NET Core revisar la documentación oficial de microsoft: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/index?view=aspnetcore-2.2

Entradas creadas 12

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Publicaciones relacionadas

Comienza escribiendo tu búsqueda y pulsa enter para buscar. Presiona ESC para cancelar.

Volver arriba