El principio del enrutamiento de punto final de ASP.NET Core

El enrutamiento de punto final ( Endpoint Routing) apareció por primera vez en ASP.NET Core2.2la ASP.NET Core3.0promoción a un ciudadano de primera clase.
Inserte la descripción de la imagen aquí

Endpoint RoutingMotivació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 RoutingMiddleware

Consta de un par de middleware:

  1. UseRoutingAgregue 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.
  2. UseEndpointsAgregue la ejecución de endpoints a la canalización de middleware. MapGetY MapPostotros 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.
  3. MapRazorPages para Razor Pages
  4. MapControllers para controladores
  5. MapHub< THub> para SignalR
  6. MapGrpcService< 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 Endpointy tendrá la capacidad de agregar lógica de procesamiento;
UseEndpointses un middleware de punto final; si
no hay coincidencia, entonces UseEndpointsdespués de ingresar el middleware.

Colocado UseRouting, UseEndpointsentre el middleware de autenticación y autorización: la
información del punto final de percepción coincide; la programación Endpointantes 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 /healthverificación de estado se define anteriormente . El punto final define los IAuthorizeDatametadatos y requiere autenticación antes de realizar la verificación de estado.


Nosotros UseRouting, UseEndpointsañ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 AuthorizeAttributemetadatos y
Inserte la descripción de la imagen aquí
supongo que si el middleware de autenticación y autorización /healthzfunciona, inevitablemente responderá a estos AuthorizeAttributemetadatos.

Entonces, hojeando el código fuente de Github AuthorizationMiddleware 3.0: descubrí que la delegación de procesamiento de solicitudes realmente prestó atención Endpointy extrajo la IAuthorizeDatainformació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 AuthorizeAttributehecho la realización de la IAuthorizeDatainterfaz.

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.

Supongo que te gusta

Origin blog.csdn.net/WuLex/article/details/112109030
Recomendado
Clasificación