El conducto de petición y respuesta ASP.NET Core es la columna vertebral de todas las aplicaciones web construidas sobre este marco.
Comprender cómo fluye una solicitud a través de su aplicación y cómo se generan las respuestas es crucial para construir aplicaciones web eficientes, mantenibles y seguras.
Esta serie le guiará a través de cada capa de la tubería, desde el momento en que una solicitud HTTP llega a su servidor hasta cuando la respuesta es enviada al cliente.
Al comprenderlo profundamente, podrás optimizar el rendimiento, implementar preocupaciones transversales de manera elegante y solucionar problemas de manera más eficaz.
NOTA: Esto es parte de mis experimentos con IA / una manera de gastar $1000 Créditos Web Código Calude.**He alimentado esto un montón de papeles, mi comprensión, preguntas que tuve que generar este artículo.**Es divertido y llena un hueco que no he visto en ningún otro lugar.
antes de pasarlo al siguiente componente
flowchart TB
OS[Operating System and Network TCP IP Socket Layer]
Kestrel[Kestrel Web Server HTTP11 HTTP2 HTTP3 QUIC TLS SSL Termination Connection Management]
Host[Host Layer Application Lifetime Dependency Injection Configuration Logging]
subgraph Middleware_Pipeline [Middleware Pipeline]
EH[Exception Handler Middleware catches exceptions]
HTTPS[HTTPS Redirection Middleware redirects HTTP to HTTPS]
Static[Static Files Middleware serves static content]
Routing[Routing Middleware matches request to endpoint]
AuthN[Authentication Middleware validates identity]
AuthZ[Authorization Middleware validates permissions]
Custom[Custom Middleware app specific logic]
EndpointMW[Endpoint Middleware executes matched endpoint]
end
EndpointExec[Endpoint Execution MVC Controllers and Actions Razor Pages Minimal APIs gRPC SignalR]
Response[Response Generation flows back through middleware]
BackKestrel[Back to Kestrel]
Client[Back to Client]
OS --> Kestrel --> Host --> EH --> HTTPS --> Static --> Routing --> AuthN --> AuthZ --> Custom --> EndpointMW --> EndpointExec --> Response --> BackKestrel --> Client
generando una respuesta inmediatamente
después de que el siguiente componente se haya ejecutado
Vamos a visualizar la arquitectura de tuberías completa en ASP.NET Core 8:
HttpContextCapa de redCrea un
HttpContextAdministra la vida útil de la aplicación
Aquí es donde comienza tu lógica de aplicación.
Recibe la
sequenceDiagram
autonumber
participant Client
participant OS as OS/Network
participant Kestrel
participant Host
participant MW as Middleware Pipeline
participant Endpoint as Endpoint Execution
Client->>OS: HTTP request
OS->>Kestrel: Forward request
Kestrel->>Host: Create HttpContext
Host->>MW: Invoke pipeline
MW->>Endpoint: Route matched, execute
Endpoint-->>MW: Response
MW-->>Kestrel: Response after post-processing
Kestrel-->>OS: Send HTTP response
OS-->>Client: Response delivered
Una acción controladora en MVCHttpContextUn manejador de páginas en páginas Razor
public abstract class HttpContext
{
// The incoming request
public abstract HttpRequest Request { get; }
// The outgoing response
public abstract HttpResponse Response { get; }
// User identity and authentication
public abstract ClaimsPrincipal User { get; set; }
// Request-scoped services
public abstract IServiceProvider RequestServices { get; set; }
// Connection information
public abstract ConnectionInfo Connection { get; }
// WebSocket support
public abstract WebSocketManager WebSockets { get; }
// Request cancellation
public abstract CancellationToken RequestAborted { get; set; }
// Session state
public abstract ISession Session { get; }
// Generic feature collection
public abstract IFeatureCollection Features { get; }
// And more...
}
Un manejador de rutas en APIs MínimasHttpContext.
Un método de hub de SignalR
// Basic middleware signature
public delegate Task RequestDelegate(HttpContext context);
// Middleware can be implemented as a method
app.Use(async (context, next) =>
{
// Do something before the next middleware
Console.WriteLine($"Request: {context.Request.Path}");
// Call the next middleware
await next(context);
// Do something after the next middleware
Console.WriteLine($"Response: {context.Response.StatusCode}");
});
public delegate Task RequestDelegate(HttpContext context);
Flujo de respuesta
Cada middleware puede inspeccionar o modificar la respuesta
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Middleware 1: Logging
app.Use(async (context, next) =>
{
Console.WriteLine($"[{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss}] Request started: {context.Request.Method} {context.Request.Path}");
await next(context);
Console.WriteLine($"[{DateTime.UtcNow:yyyy-MM-dd HH:mm:ss}] Request finished: {context.Response.StatusCode}");
});
// Middleware 2: Custom header
app.Use(async (context, next) =>
{
context.Response.Headers["X-Custom-Header"] = "Hello from middleware!";
await next(context);
});
// Middleware 3: Short-circuit for specific path
app.Use(async (context, next) =>
{
if (context.Request.Path == "/health")
{
context.Response.StatusCode = 200;
await context.Response.WriteAsync("Healthy");
return; // Short-circuit - don't call next()
}
await next(context);
});
// Endpoint
app.MapGet("/", () => "Hello World!");
app.Run();
Finalización de las cabecerashttp://localhost:5000/El cuerpo de respuesta está escrito
Console output:
[2024-01-15 10:30:45] Request started: GET /
[2024-01-15 10:30:45] Request finished: 200
Browser output:
Hello World!
Response headers:
X-Custom-Header: Hello from middleware!
Kestrel envía la respuesta HTTP al clientehttp://localhost:5000/health:
Console output:
[2024-01-15 10:30:50] Request started: GET /health
[2024-01-15 10:30:50] Request finished: 200
Browser output:
Healthy
Response headers:
X-Custom-Header: Hello from middleware!
Request/Response Sequence Diagram/healthConceptos clave
Los
**es el objeto central en la tubería.**Encapsula:
Todo lo que necesita saber sobre la solicitud actual y todo lo que necesita para construir la respuesta es accesible a través deMiddleware
**Middleware es el bloque de construcción de la tubería.**En su más simple, middleware es una función que procesa una petición:
Solicitud DelegadasUn delegado de solicitud es una función que puede procesar una solicitud HTTP.
**Toda la tubería de middleware se construye a partir de una cadena de delegados de petición:**Cada middleware envuelve al siguiente delegado, creando una cadena anidada de llamadas.
Veamos una aplicación mínima ASP.NET Core 8 que demuestra la tubería:
Cuando usted visita
**, ya verás:**Cuando usted visita
Observe cómo el tercer middleware cortocircuito la tubería para elruta, pero todo el middleware antes de que todavía se ejecuta.
Por qué es importante entender el oleoductoComprender la tubería es crucial porque:
Optimización del rendimiento: Conocer el orden de ejecución le ayuda a colocar operaciones costosas adecuadamente y evitar trabajos innecesarios.
Preocupaciones cruzadas: Middleware es perfecto para implementar registro, autenticación, manejo de errores y otras preocupaciones que afectan a todas las solicitudes.IStartupFilter, IHostedServiceDepuración
HttpContextSeguridadEn esta primera parte, hemos establecido la base mediante la comprensión de lo que es el gasoducto, cómo está estructurado, y cómo las peticiones fluyen a través de él.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.