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 18

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 鈥淗ttpContent鈥 en lugar del correcto que era 鈥淗ttpContext鈥

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.

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

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();
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.

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

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 鈥淣amespace鈥 del archivo TimeMiddleware en la clase Program para que funcione como en el video.

este curso esta excelente !!!

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`.
Edwin estancio
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.

聽 聽 }

}

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

  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 鈥渢ime鈥. 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 鈥渢ime鈥 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().

using Microsoft.AspNetCore.Mvc;

namespace webapi.Controllers;

[ApiController]
[Route(鈥渁pi/[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.