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.
Introducción a API en .NET
Domina las API con .NET
Prerrequisitos
¿Qué es una API?
¿Qué es REST?
Creando tu primera API con .NET
Funcionamiento de una API en .NET
Consumiendo API desde Postman
Análisis del template para APIs de .NET
Atributos para verbos HTTP
Manejo de rutas
Minimal API vs. Web API
Arquitectura y configuración
¿Qué son los middlewares?
Creando un nuevo middleware
Inyección de dependencias
Agregando Logging a API
Documentando API con Swagger
Manipulación de datos con Entity Framework
Agregando librerías para Entity Framework
Configuración de Entity framework y clases base
Creación de servicios
Inyectando servicios como dependencia
Creando controladores
Probando API con una base de datos SQL server
Outro
Retrospectiva: APIs con .NET
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Miguel Teheran
Aportes 25
Preguntas 21
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
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>();
}
}
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.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.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.
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.
//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.
}
}
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.
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.
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())
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
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.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?