No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Creando un nuevo middleware

12/22
Recursos

Aportes 25

Preguntas 21

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Este comentario solo es para reconocer lo buena que estuvo esta clase y el buen docente que eres @Miguel Teheran, espero de verdad seguir viendo más cursos de tu parte.

Se lanzó una excepción cuando cambié de orden la ejecución del siguiente middleware.
Lo solucioné colocando un simple return antes de que se ejecutara el siguiente:

    public async Task Invoke (HttpContext context)
    {
        if(context.Request.Query.Any( p=> p.Key == "time"))
        {
            await context.Response.WriteAsync(DateTime.Now.ToShortTimeString());
            return;
        }
        await next(context); 


    }

Si a alguien le pasa lo mismo, espero que esto les auide a solucionarlo c;

En el minuto 4:05 Miguel agrega todo el namespace para corregir un problema supuestamente porque se está tomando el tipo de datos equivocado, el problema era más sencillo … habia escrito “HttpContent” en lugar del correcto que era “HttpContext”

Es el curso más concreto y completo que he visto, sin tanta explicación de cosas que nada que ver

Creando un nuevo middleware


public class TimeMiddleware
{
	private readonly RequestDelegate _next;

	public TimeMiddleware(RequestDelegate next)
	{
		_next = next;
	}

	public async Task InvokeAsync(HttpContext context)
	{
		await _next(context);
		if (context.Request.Query.Any(x => x.Key == "time"))
		{
			await context.Response.WriteAsync(DateTime.Now.ToShortTimeString());

		}
	}
}

public static class TimeMiddlewareExtensions
{
	public static IApplicationBuilder UseTimeMiddleware(this IApplicationBuilder builder)
	{
		return builder.UseMiddleware<TimeMiddleware>();
	}
}
  • Cree una clase que implemente la interfaz IMiddleware: Debe crear una clase que implemente la interfaz IMiddleware y tenga un método llamado Invoke. Este método es el que se ejecutará cuando se invoque el middleware.
  • Agregue el código personalizado: Dentro del método Invoke, puede agregar el código que desea ejecutar cuando se invoque el middleware. Por ejemplo, puede agregar lógica para capturar errores, realizar seguimiento de solicitudes o autenticar a un usuario.
  • La línea await _next(context); en el código de un middleware se usa para continuar con la siguiente etapa en la cadena de middlewares. En otras palabras, esta línea permite que el control pase al siguiente middleware en la cadena para que pueda realizar su procesamiento.
  • El objeto HttpContext que se pasa como argumento a la función InvokeAsync contiene información sobre la solicitud HTTP actual y la respuesta que se está construyendo. El argumento _next es un delegado RequestDelegate que representa la siguiente etapa en la cadena de middlewares.
  • Añada el middleware a la cadena de solicitudes: Finalmente, debe añadir el middleware a la cadena de solicitudes en el archivo program.cs . Esto se puede hacer llamando al método UseMiddleware y proporcionando una instancia de su clase de middleware personalizado.
app.UseTimeMiddleware();

Hay que anotar que al parecer con la versión 7 se genera una excepción implementando el código como lo tenía. Por lo que tuve que dejarlo de la siguiente forma

public async Task Invoke(HttpContext context){
        
        if(context.Request.Query.Any(p => p.Key == "time")){
            await context.Response.WriteAsync(DateTime.Now.ToShortTimeString());
            return;
        }

        await _next(context);
    }

Hola, sinceramente vi tres veces esta clase y no entendi nada, se van mencionando conceptos que no tengo claros, en conclusión, no se que hizo. Alguien me puede hacer un resumen para seguir con el curso ? Gracias.

Middlewares
(Programas intermedios)
• La base de como funciona cada uno de los request.
• Es una serie de instrucciones de código que se agregan al ciclo de vida de una petición HTTP.
• Provee una ejecución de peticiones a través de capas.
• Facilitan la implementación de interceptores y filtros sobre las peticiones en una API.
• Es mucho más fácil ver la secuencia de comandos que se ejecutan por cada petición e implementar middleware personalizados (con código a demanda ) para interceptar algún request y agregar algún comportamiento adicional.

Middleware **página de bienvenida **

app.UseWelcomePage();

Excelente clase!!
Definitivamente pienso borrar este middleware porque me está generando más problemas que beneficios, pero fue genial poder entender el concepto de middleware de una forma tan sencilla

En mis palabras diría que los middlewares son procesos que se van realizando en cadena uno después del otro desde que empieza el request, hasta que se termina el proceso y se llega al endpoint que sería donde devolvemos datos al usuario

En mi caso no muestra solo la hora, a mi me muestra un error en la consola que dice:

The response has already started, the error page middleware will not be executed.

el response es 200 pero sin ningun valor de response

Hola, como dato adicional:
Si están realizando la creación de Middlewares en Visual Studio (versión Community por ejemplo) recordar que hay que usar el Using “Namespace” del archivo TimeMiddleware en la clase Program para que funcione como en el video.

me parece muy mal que en la nueva version omitan la fecha en la que se realizan los comentarios, esto nos da a simple vista que tanantiguo es el curso y que tan desactualizado es el contenido que estamos consumiendo. Como observación me gustaría que se mostrara esa información y que uno como usuario decida si hace o no el curso, como estaba en la versión anterior.

En este video hay dos conceptos. La creación de Middlewares y también la creación de extensiones. Muy buen ejemplo en poco código.

if (*context*.Request.Query.Any(*p* => *p*.Key == "time")) { await *context*.Response.WriteAsync(*DateTime*.Now.ToLongDateString()); //return; } `//para ver dia de la semana y fecha completa por ejemplo: martes, 16 de enero de 2024`

Explicacion del codigo, Acepto feedback

  //Ejemplo basico de un middleware

class TimeMiddleware{

    readonly RequestDelegate next; // Esta prop de tipo RequestDelegate es para que ayude a pasar al siguiente middleware

    public TimeMiddleware(RequestDelegate nextRequest){

        next = nextRequest; //En el constructor se le asigna el proximo middleware

    }

  

    public async Task Invoke(HttpContext context){//Metodo asincrono que debe tener todo middleware.

        await next(context);// Pasamos el contexto de la consulta http ante todo.
        
		//A partir de aqui empieza la logica a la que va destinada el middleware.
        if(context.Request.Query.Any(prop => prop.Key == "time")){//Evaluamos si existe un queryParam con el nombre de llave "time"

            await context.Response.WriteAsync(DateTime.Now.ToShortTimeString());// Si existe el la url entorces acompañamos la respuesta con la hora actual.

        }

    }

}

  

public static class TimeMiddlewareExtension{ // Clase encargada de seleccionar el middleware que queremos utilizar.

    public static IApplicationBuilder UseTimeMiddleware(this IApplicationBuilder builder){// Mediante este metodo contruimos el llamado al middleware.

        return builder.UseMiddleware<TimeMiddleware>();//Retornamos la llamada al middleware.

    }

}
  1. La clase Microsoft.AspNetCore.Http.HttpContext:

La clase HttpContext representa el contexto de una solicitud HTTP específica que llega al servidor y proporciona acceso a información relevante sobre esa solicitud y su respuesta asociada. Contiene objetos que representan la solicitud entrante (Request) y la respuesta saliente (Response), así como otras propiedades y métodos útiles relacionados con el procesamiento de la solicitud.

  1. El método Invoke:

En el contexto del middleware, el método Invoke es esencial. Un middleware es una parte del procesamiento de solicitudes que se ejecuta entre el envío de una solicitud al servidor y la generación de la respuesta al cliente. En el método Invoke, se define la lógica que se aplicará durante el procesamiento de cada solicitud que pase por el middleware.

  1. Explicación del código en el método Invoke:

El código dentro del método Invoke es una lógica muy simple que responde a una solicitud específica. Acá está la explicación paso a paso:

if (context.Request.Query.Any(p => p.Key == "time"))

Esta línea verifica si en la URL de la solicitud (context.Request) hay algún parámetro denominado “time”. context.Request.Query representa la colección de parámetros de la URL, y Any es una función que verifica si existe algún elemento que cumpla la condición proporcionada.

await context.Response.WriteAsync(DateTime.Now.ToShortTimeString())
  • Si el parámetro “time” está presente en la URL, se ejecutará este bloque de código. Aquí, se obtiene la hora actual del servidor mediante DateTime.Now, y se llama al método ToShortTimeString() para obtener la representación de la hora en formato corto (por ejemplo, “15:30” para las 3:30 PM). Luego, esa hora se envía como respuesta al cliente utilizando context.Response.WriteAsync().
En el contexto de .NET, un middleware se refiere a un componente que se encuentra entre una solicitud entrante y la lógica de procesamiento principal de una aplicación. En el marco de ASP.NET Core, por ejemplo, los middleware son componentes que se utilizan para manejar solicitudes HTTP. Los middleware pueden realizar tareas como autenticación, autorización, manejo de errores, registro, compresión de respuestas, entre otras. Aquí hay algunos puntos clave sobre el middleware en .NET: 1. Pipeline de solicitud-respuesta: En ASP.NET Core, el procesamiento de solicitudes HTTP se realiza a través de un pipeline de solicitud-respuesta. El pipeline consiste en una secuencia de middleware que se ejecutan en orden para procesar las solicitudes entrantes y generar las respuestas correspondientes. 1. Clases Middleware: Los middleware en ASP.NET Core son implementados como clases que implementan la interfaz `IMiddleware` o son funciones que toman un `HttpContext` como argumento. Estas clases o funciones pueden realizar acciones específicas, como autenticar usuarios, verificar permisos, o agregar encabezados a las respuestas. 1. Orden de Ejecución: El orden en que se registran los middleware en la aplicación determina el orden en que se ejecutan. Esto es importante ya que el resultado de un middleware puede afectar el procesamiento de los middleware subsiguientes. 1. Uso de Middleware: Los middleware se registran en el método `Configure` del archivo `Startup.cs` de la aplicación ASP.NET Core. Allí se especifica el orden y la lógica de cada middleware. Por ejemplo, un middleware de registro simple podría verse así en ASP.NET Core: ```c# public class LoggingMiddleware { private readonly RequestDelegate _next; public LoggingMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { // Lógica de registro antes de pasar la solicitud al siguiente middleware Console.WriteLine($"Request: {context.Request.Path}"); // Pasar la solicitud al siguiente middleware en el pipeline await _next(context); } } public static class LoggingMiddlewareExtensions { public static IApplicationBuilder UseLoggingMiddleware(this IApplicationBuilder builder) { return builder.UseMiddleware<LoggingMiddleware>(); } } ``` Este middleware registra la ruta de la solicitud en la consola antes de pasarla al siguiente middleware en el pipeline. Para usar este middleware, se debe llamar al método `UseLoggingMiddleware` en el método `Configure` de `Startup.cs`.

Cual sería un caso o esenario real donde se implementaría un middleware personalizado??

este curso esta excelente !!!

Me han gustado todas las clases y cursos de Miguel, pero en esta siento que hubo un aumento de dificultad considerable y que le faltó explicar varias cosas así sean solo de configuración. Quedé bastante perdido la verdad y eso que ya he trabajado con Middlewares en Node JS

Edwin estancio

using Microsoft.AspNetCore.Mvc;

namespace webapi.Controllers;

[ApiController]
[Route(“api/[controller]”)]

public class HelloWorldController: ControllerBase
{

private readonly ILogger<HelloWorldController> _logger;
//Inyectamos la dependencia
IHelloWordService helloWordService;

//lo recibimos en el constructor
public HelloWorldController(IHelloWordService  helloWord, ILogger<HelloWorldController> logger )
{
   _logger=logger;
    helloWordService=helloWord;

}

//Finalmente lo usuamos
public IActionResult Get()
{
    _logger.LogDebug("Retornando helloworld");
    return Ok(helloWordService.GetHelloworld());


}

}

Invoke -Viene por defecto en los middleware
Next - Hace el llamado al siguiente Middleware

Excelente profesor

Excelente Clase @Miguel Teherán, espero muchos cursos de tu parte.