El enrutamiento de punto final ( Endpoint Routing
) apareció por primera vez en ASP.NET Core2.2
la ASP.NET Core3.0
promoción a un ciudadano de primera clase.
Endpoint Routing
Motivación
Antes de la aparición del enrutamiento de puntos finales, generalmente definimos el enrutamiento de resolución de middleware MVC al final de la canalización de procesamiento de solicitudes. Este enfoque significa que en la canalización de procesamiento, el middleware anterior al middleware MVC no podrá obtener información de enrutamiento.
La información de enrutamiento es muy útil para algunos middleware, como CORS, middleware de autenticación (la información de enrutamiento puede usarse en el proceso de autenticación).
Al mismo tiempo, el enrutamiento de punto final extrae el concepto de punto final, desacopla la lógica de coincidencia de enrutamiento y la distribución de solicitudes.
Endpoint Routing
Middleware
Consta de un par de middleware:
UseRouting
Agregue coincidencia de rutas a la canalización de middleware. El middleware examina el conjunto de puntos finales definidos en la aplicación y selecciona la mejor coincidencia en función de la solicitud.UseEndpoints
Agregue la ejecución de endpoints a la canalización de middleware.MapGet
YMapPost
otros métodos conectan la lógica de procesamiento al sistema de enrutamiento; otros métodos conectan las características del marco ASP.NET Core al sistema de enrutamiento.MapRazorPages
para Razor PagesMapControllers
para controladoresMapHub< THub>
para SignalRMapGrpcService< TService>
para gRPC
El middleware aguas arriba de este par de middleware: siempre no se puede percibir Endpoint
;
el middleware entre el par de middleware percibirá el emparejamiento Endpoint
y tendrá la capacidad de agregar lógica de procesamiento;
UseEndpoints
es un middleware de punto final; si
no hay coincidencia, entonces UseEndpoints
después de ingresar el middleware.
Colocado UseRouting
, UseEndpoints
entre el middleware de autenticación y autorización: la
información del punto final de percepción coincide; la programación Endpoint
antes de la política de autorización de la aplicación.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// Matches request to an endpoint.
app.UseRouting();
// Endpoint aware middleware.
// Middleware can use metadata from the matched endpoint.
app.UseAuthentication();
app.UseAuthorization();
// Execute the matched endpoint.
app.UseEndpoints(endpoints =>
{
// Configure the Health Check endpoint and require an authorized user.
endpoints.MapHealthChecks("/healthz").RequireAuthorization();
// Configure another endpoint, no authorization requirements.
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
}
La /health
verificación de estado se define anteriormente . El punto final define los IAuthorizeData
metadatos y requiere autenticación antes de realizar la verificación de estado.
Nosotros UseRouting
, UseEndpoints
añadimos un poco de código de prueba entre: los puntos finales de percepción:
app.Use(next => context =>
{
var endpoint = context.GetEndpoint();
if (endpoint is null)
{
return Task.CompletedTask;
}
Console.WriteLine($"Endpoint: {endpoint.DisplayName}");
if (endpoint is RouteEndpoint routeEndpoint)
{
Console.WriteLine("Endpoint has route pattern: " +
routeEndpoint.RoutePattern.RawText);
}
foreach (var metadata in endpoint.Metadata)
{
Console.WriteLine($"Endpoint has metadata: {metadata}");
}
return next(context);
});
Al solicitar /healthz
, percibo los AuthorizeAttribute
metadatos y
supongo que si el middleware de autenticación y autorización /healthz
funciona, inevitablemente responderá a estos AuthorizeAttribute
metadatos.
Entonces, hojeando el código fuente de Github AuthorizationMiddleware 3.0: descubrí que la delegación de procesamiento de solicitudes realmente prestó atención Endpoint
y extrajo la IAuthorizeData
información de autorización en los metadatos .
// ---- 截取自https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs-----
if (endpoint != null)
{
context.Items[AuthorizationMiddlewareInvokedWithEndpointKey] = AuthorizationMiddlewareWithEndpointInvokedValue;
}
var authorizeData = endpoint?.Metadata.GetOrderedMetadata<IAuthorizeData>() ?? Array.Empty<IAuthorizeData>();
var policy = await AuthorizationPolicy.CombineAsync(_policyProvider, authorizeData);
if (policy == null)
{
await _next(context);
return;
}
var policyEvaluator = context.RequestServices.GetRequiredService<IPolicyEvaluator>();
......
Lo que percibe el código de prueba es de AuthorizeAttribute
hecho la realización de la IAuthorizeData
interfaz.
bingo, adivina la verificación del código fuente.
En conclusión
Enrutamiento de puntos finales: permite que las aplicaciones ASP.NET Core determinen los puntos finales que se programarán al principio de la canalización del middleware, de modo que el middleware posterior pueda usar esta información para proporcionar funciones que la configuración actual de la canalización no puede proporcionar.
Esto hace que el marco ASP.NET Core sea más flexible y refuerza el concepto de puntos finales. Desacopla las funciones de comparación y análisis de enrutamiento de las funciones de programación de puntos finales.