Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

408
Vistas
Parámetro de ruta con barra inclinada "/" en URL

Sé que puede aplicar un comodín en el atributo de ruta para permitir / como la entrada de fecha, por ejemplo:

 [Route("orders/{*orderdate}")]

El problema con el comodín solo se aplica al último parámetro en URI. ¿Cómo resuelvo el problema si quiero tener el siguiente URI:

 [Route("orders/{orderdate}/customers")]

Actualizar:

Sé que hay pocas opciones para resolver el problema refactorizando el código, así que no ofrezca una solución como:

  1. cambie la plantilla de ruta a [Route("orders/customers/{orderdate}")]
  2. cambiar la fecha a un formato diferente (por ejemplo, "dd-mm-yyyy" )
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

@bet... Creo que genericUriParserOptions ya no es aplicable a .net 4.5 o posterior...

También como lo sugiere @JotaBe , es posible que deba decodificar correctamente la solicitud de URL. En la mayoría de los casos, %2F se traducirá automáticamente a una barra inclinada '/' . Entonces, si necesita escapar, deberá decodificar el carácter '%' en primer lugar ... por lo que su URL: se verá así: www.domain.com/api/orders/23%252F06%252F2015/customers

Observe que los caracteres '%252F' se traducirán al '%2F' real

EDITAR

Ok, aquí está la solución completa (lo probé y funcionó para mí):

  1. Suponiendo que tiene un punto final de API como este:

     [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { }
  2. En web.config , deberá configurar requestPathInvalidCharacters para que esté vacío, lo que le indica a asp.net que permita todas las solicitudes

     <system.web> <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/> </system.web> <system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>
  3. Cuando el cliente envíe la solicitud a la API, deberá asegurarse de escapar del '%' siguiente manera:

    www.dominio.com/api/pedidos/23%252F06%252F2015/clientes

  4. A continuación, debe decodificar la solicitud.

     [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015 }
over 4 years ago · Santiago Trujillo Denunciar

0

Como se señaló en el comentario de @AlexeiLevenkov, esto está mal:

No puede tener un parámetro en la URL que acepte barras diagonales, porque este es un símbolo especial que separa cada fragmento de URL. Por lo tanto, cada vez que incluya este símbolo en su URL, habrá nuevos fragmentos y un solo parámetro no puede incluir varios fragmentos.

Si quieres más detalles, lee esto , pero estos son los extractos más relevantes:

  • la ruta URL termina en el primero ? o # encontrado en la URL. Por lo tanto, las barras inclinadas solo crean fragmentos en la sección de la ruta de la URL antes de la ocurrencia de uno de esos símbolos.
  • De la sección 3.4: El componente de consulta se indica con el primer carácter de signo de interrogación ("?") y termina con un carácter de signo de número ("#") o al final del URI.

Por lo tanto, la cadena de consulta puede incluir barras diagonales, / , si lo desea, y no definirán segmentos de ruta en absoluto.

Estas son algunas soluciones para la pregunta:

  • incluya fragmentos para el día, el mes y el año, como este: [Route("orders/{month}/{day}/{year}/customers")] y luego cree la fecha en el lado del servidor
  • requiere que el usuario use un separador diferente, como un guión o un punto, que no creará problemas, recíbalo en una cadena y analícelo usted mismo (o use su propio archivador personalizado para admitir ese formato)
  • use la extensión de reescritura de URL para cambiar la URL antes de que llegue al sistema de enrutamiento y analícela como se explica en la solución anterior (esto requiere hospedaje en IIS)
  • recíbalo como una cadena de consulta, es decir, algo como esto: ´?date=02/03/2015´ (será mejor que lo codifique)

NOTA: su pregunta original decía "cadena de consulta", y mi comentario sobre la codificación se refería a la cadena de consulta, que es el último segmento de una URL después del signo de interrogación, si está presente, like &id=27 . Corregí su pregunta para que no mencione "cadena de consulta", que no era el nombre correcto para lo que necesita

over 4 years ago · Santiago Trujillo Denunciar

0

Puede usar el siguiente URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")] y luego usar un archivador de modelo personalizado para tomar DD/MM/YY y conviértalos en una fecha que pueda vincular en su método de acción.

Puede elegir cómo desea manejar las restricciones (ser más estricto con las expresiones regulares) o usar la validación y devolver 400 si no coincide.

El enfoque más simple es tomar el Day/Month/Year y juntarlo en código.

Aquí hay un enlace para tratar con modelbinding .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda