Cómo crear restricciones de ruta en ASP.NET Core

Las restricciones de ruta en ASP.NET Core se utilizan para filtrar o restringir que los datos no deseados lleguen a las acciones de su controlador. Para obtener una introducción al enrutamiento en ASP.NET Core, puede consultar mi artículo anterior sobre enrutamiento basado en atributos versus enrutamiento basado en convenciones en ASP.NET Core. Este artículo va más allá de los conceptos básicos para explorar las operaciones avanzadas utilizando restricciones de ruta.

Para trabajar con los ejemplos de código proporcionados en este artículo, debe tener Visual Studio 2019 instalado en su sistema. Si aún no tiene una copia, puede descargar Visual Studio 2019 aquí. 

Cree un proyecto ASP.NET Core MVC en Visual Studio 2019

En primer lugar, creemos un proyecto ASP.Net Core en Visual Studio 2019. Suponiendo que Visual Studio 2019 esté instalado en su sistema, siga los pasos que se describen a continuación para crear un nuevo proyecto ASP.Net Core en Visual Studio.

  1. Inicie el IDE de Visual Studio.
  2. Haga clic en "Crear nuevo proyecto".
  3. En la ventana "Crear nuevo proyecto", seleccione "Aplicación web ASP.NET Core" de la lista de plantillas que se muestra.
  4. Haga clic en Siguiente.
  5. En la ventana "Configure su nuevo proyecto", especifique el nombre y la ubicación del nuevo proyecto.
  6. Opcionalmente, marque la casilla de verificación “Colocar la solución y el proyecto en el mismo directorio”, según sus preferencias.
  7. Haga clic en Crear.
  8. En la ventana "Crear una nueva aplicación web ASP.NET Core" que se muestra a continuación, seleccione .NET Core como tiempo de ejecución y ASP.NET Core 3.1 (o posterior) de la lista desplegable en la parte superior.
  9. Seleccione "Aplicación web (Modelo-Vista-Controlador)" como plantilla de proyecto para crear una nueva aplicación ASP.NET Core MVC. 
  10. Asegúrese de que las casillas de verificación "Habilitar compatibilidad con Docker" y "Configurar para HTTPS" no estén marcadas, ya que no usaremos esas funciones aquí.
  11. Asegúrese de que la autenticación esté configurada en "Sin autenticación", ya que tampoco usaremos autenticación.
  12. Haga clic en Crear.

Si sigue estos pasos, se creará un nuevo proyecto ASP.NET Core MVC en Visual Studio 2019. Usaremos este proyecto en las secciones siguientes para ilustrar cómo podemos usar restricciones de ruta en ASP.NET Core 3.1.

La clase RouteCollection en ASP.NET Core

La clase RouteTable en ASP.NET Core contiene una propiedad denominada Routes que almacena todas las rutas como RouteCollection. La clase RouteCollection contiene algunos métodos de extensión que pueden usarse para mapear rutas o ignorarlas.

MapRoute es un método sobrecargado que acepta restricciones como parámetro. Puede usar esto para pasar su restricción a la ruta. La siguiente es la declaración del método MapRoute.

Ruta estática pública MapRoute (estas rutas de RouteCollection, nombre de cadena,

    URL de cadena, valores predeterminados del objeto, restricciones del objeto);

La interfaz IRouteConstraint en ASP.NET Core

La interfaz IRouteConstraint es un contrato que contiene la declaración de un solo método llamado Match. Esta interfaz debe ser extendida por una clase y el método Match implementado en ella para verificar si un parámetro de URL en particular es válido para una restricción. Así es como se define la interfaz IRouteConstraint:

espacio de nombres Microsoft.AspNetCore.Routing

{

    interfaz pública IRouteConstraint

    {

        bool Match

            HttpContext httpContext,

            Ruta IRouter,

            cadena routeKey,

            Valores de RouteValueDictionary,

            RouteDirection routeDirection);

    }

}

El diccionario ConstraintMap en ASP.NET Core

Un ConstraintMap es un diccionario que contiene una lista de restricciones de ruta que asigna las claves de restricción de ruta a las implementaciones de IRouteConstraint. El fragmento de código que se proporciona a continuación ilustra cómo puede agregar sus restricciones personalizadas a este diccionario.

public void ConfigureServices (servicios IServiceCollection) 

{  

  services.Configure (routeOptions =>  

  { 

     routeOptions.ConstraintMap.Add ("emailconstraint", typeof (EmailRouteContraint)); 

  }); 

Implementar el método IRouteConstraint Match en ASP.NET Core

Para crear una restricción de ruta personalizada, debe crear una clase que amplíe la interfaz IRouteConstraint e implemente su método Match. La restricción se puede utilizar para frustrar las solicitudes entrantes no deseadas y evitar que una ruta coincida a menos que se cumpla una condición particular. Por ejemplo, es posible que desee asegurarse de que el parámetro pasado a un método de acción sea siempre un número entero.

El método Match acepta los siguientes parámetros:

  • HttpContext: encapsula toda la información específica de HTTP sobre una solicitud
  • IRouter: representa el enrutador que aplicará las restricciones
  • RouteKey: representa el parámetro de ruta que se está validando.
  • RouteDirection: una enumeración que contiene dos valores, a saber, IncomingRequest y UrlGeneration, y se usa para indicar si la URL se está procesando desde la solicitud HTTP o generando una URL
  • RouteValues: contiene los parámetros de URL

Estructura de una restricción de ruta personalizada en ASP.NET Core

A continuación, se muestra un ejemplo de la estructura de una restricción de ruta personalizada:

clase pública CustomRouteConstraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, ruta IRouter,

        cadena routeKey, valores RouteValueDictionary,

        RouteDirection routeDirection)

        {

            lanzar nueva NotImplementedException ();

        }

    }

Ejemplo de restricción de ruta personalizada en ASP.NET Core

Implementemos ahora una restricción de ruta personalizada que puede verificar los ID de correo electrónico. En primer lugar, cree una clase que amplíe la interfaz IRouteConstraint e implemente el método Match. El siguiente fragmento de código muestra una clase de restricción de ruta personalizada denominada EmailRouteContraint que amplía la interfaz IRouteConstraint.

clase pública EmailRouteContraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, ruta IRouter,

        cadena routeKey, valores RouteValueDictionary,

        RouteDirection routeDirection)

        {

            devuelve verdadero;

        }

    }

La siguiente lista de códigos muestra la clase EmailRouteConstraint con el método Match implementado.

clase pública EmailRouteContraint: IRouteConstraint

    {

        public bool Match (HttpContext httpContext, ruta IRouter,

        cadena routeKey, valores RouteValueDictionary,

        RouteDirection routeDirection)

        {

            if (valores.PruebaGetValue (routeKey, out var routeValue))

            {

                var parameterValueString = Convert.ToString (routeValue,

                CultureInfo.InvariantCulture);

                return IsEmailAddressValid (parameterValueString);

            }

            falso retorno;

        }

        private bool IsEmailAddressValid (string emailAddress)

        {

            devuelve verdadero;

        }

    }

Tenga en cuenta que el método IsEmailAddressValid aquí simplemente devuelve "verdadero". Dejo en sus manos escribir el código necesario para validar la dirección de correo electrónico.

Registrar una restricción de ruta personalizada en ASP.NET Core

Debe registrar su restricción de ruta personalizada con el sistema de enrutamiento en el método ConfigureServices de la clase Startup. El siguiente fragmento de código ilustra esto. 

public void ConfigureServices (servicios IServiceCollection)

      {

          services.AddControllersWithViews ();

          services.Configure (routeOptions =>

          {

              routeOptions.ConstraintMap.Add ("ERC",

              typeof (EmailRouteContraint));

          });

      }

También debe configurar su restricción de ruta personalizada en el método Configure de la clase Startup como se muestra en el fragmento de código a continuación.

app.UseEndpoints (puntos finales =>

{

     endpoints.MapControllerRoute (

         nombre: "predeterminado",

         restricciones: nuevo {ERC = new EmailRouteContraint ()},

         patrón: "{controlador = Inicio} / {acción = Índice} / {id?}");

});

Y eso es. Ahora puede especificar la restricción en su controlador o sus métodos de acción y comenzar a usar la aplicación.

El tiempo de ejecución de ASP.NET Core valida si el patrón definido y las restricciones de ruta coinciden con el patrón y los valores de la solicitud entrante. La lógica de validación de la restricción se define dentro del método Match de su restricción de ruta personalizada. Puede aprovechar las restricciones para evitar solicitudes innecesarias, así como para validar los valores de ruta antes de que la solicitud se pase a un método de acción.

Cómo hacer más en ASP.NET Core:

  • Cómo administrar los secretos de usuario en ASP.NET Core
  • Cómo crear aplicaciones de gRPC en ASP.NET Core
  • Cómo redirigir una solicitud en ASP.NET Core
  • Cómo usar el enrutamiento de atributos en ASP.NET Core
  • Cómo pasar parámetros a métodos de acción en ASP.NET Core MVC
  • Cómo usar los analizadores de API en ASP.NET Core
  • Cómo usar tokens de datos de ruta en ASP.NET Core
  • Cómo usar el control de versiones de API en ASP.NET Core
  • Cómo usar objetos de transferencia de datos en ASP.NET Core 3.1
  • Cómo manejar errores 404 en ASP.NET Core MVC
  • Cómo usar la inyección de dependencia en filtros de acción en ASP.NET Core 3.1
  • Cómo usar el patrón de opciones en ASP.NET Core
  • Cómo usar el enrutamiento de punto final en ASP.NET Core 3.0 MVC
  • Cómo exportar datos a Excel en ASP.NET Core 3.0
  • Cómo usar LoggerMessage en ASP.NET Core 3.0
  • Cómo enviar correos electrónicos en ASP.NET Core
  • Cómo registrar datos en SQL Server en ASP.NET Core
  • Cómo programar trabajos usando Quartz.NET en ASP.NET Core
  • Cómo devolver datos de ASP.NET Core Web API
  • Cómo formatear los datos de respuesta en ASP.NET Core
  • Cómo consumir una API web ASP.NET Core con RestSharp
  • Cómo realizar operaciones asíncronas usando Dapper
  • Cómo usar marcas de características en ASP.NET Core
  • Cómo usar el atributo FromServices en ASP.NET Core
  • Cómo trabajar con cookies en ASP.NET Core
  • Cómo trabajar con archivos estáticos en ASP.NET Core
  • Cómo utilizar Middleware de reescritura de URL en ASP.NET Core
  • Cómo implementar la limitación de velocidad en ASP.NET Core
  • Cómo usar Azure Application Insights en ASP.NET Core
  • Uso de funciones avanzadas de NLog en ASP.NET Core
  • Cómo manejar errores en ASP.NET Web API
  • Cómo implementar el manejo de excepciones global en ASP.NET Core MVC
  • Cómo manejar valores nulos en ASP.NET Core MVC
  • Control de versiones avanzado en ASP.NET Core Web API
  • Cómo trabajar con servicios de trabajador en ASP.NET Core
  • Cómo usar la API de protección de datos en ASP.NET Core
  • Cómo usar middleware condicional en ASP.NET Core
  • Cómo trabajar con el estado de la sesión en ASP.NET Core
  • Cómo escribir controladores eficientes en ASP.NET Core