www org mapwingis mapwindows mapwindow español c# url asp.net-web-api asp.net-web-api-routing attributerouting

c# - org - mapwindows 5



Parámetro de ruta con barra "/" en URL (3)

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 mediante la refacturación del código, así que no ofrezcas una solución como:

  1. cambie la plantilla de ruta a [Route("orders/customers/{orderdate}")]
  2. cambie la fecha a un formato diferente (por ejemplo, "dd-mm-yyyy" )

@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, el% 2F se traducirá automáticamente a una barra inclinada ''/'', por lo que si necesita escapar tendrá que decodificar el carácter ''%'' en primer lugar ... por lo que su URL: se verá algo así como: 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 (Probé y trabajando para mí):

  1. Suponiendo que tienes un punto final API como ese:

    [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { }

  2. En el archivo web.config, deberá configurar requestPathInvalidCharacters para vaciar, 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ía la solicitud a la API, deberá asegurarse de escapar del ''%'' de la siguiente manera:

    www.dominio.com/api/orders/23%252F06%252F2015/customers

  4. Luego necesita 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 }


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

Puedes elegir cómo quieres lidiar con las restricciones (ir 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 el código.

Aquí hay un enlace para tratar con el enlace de modelos .


Como se señala en el comentario de @AlexeiLevenkov, esto es incorrecto:

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. Entonces, cada vez que incluya este símbolo en su URL, habrá nuevos fragmentos, y un solo parámetro no puede incluir varios fragmentos.

Si desea más detalles, lea esto , pero estos son los extractos más relevantes:

  • la ruta de la URL termina en la primera ? o # encontrado en la URL. Por lo tanto, las barras solo crean fragmentos en la sección de la ruta URL antes de la ocurrencia o uno de esos símbolos.
  • Desde la sección 3.4: el componente de consulta se indica con el primer carácter 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 se 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, de esta manera: [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 guión o punto, que no creará problemas, lo recibirá en cadena y lo analizará usted mismo (o usará su propia carpeta personalizada para respaldar ese formato)
  • utilice la extensión de reescritura de URL para cambiar la URL antes de que llegue al sistema de enrutamiento y analícela como se explicó en la solución anterior (esto requiere alojamiento 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í tu pregunta para que no mencionara "cadena de consulta", que no era el nombre correcto para lo que necesitas