Usando dos puntos (:) en una url con ASP.NET/IIS

Estoy implementando un controlador personalizado en ASP.NET MVC y realmente quiero poder usar dos puntos en las direcciones URL, para poder identificar los nombres de clase / columna y sus valores, así:

http://example.com/user:chaiguy

… pero aparentemente ASP.NET o IIS no permite dos puntos en las URL. Hice algunas excavaciones y aparentemente se considera un problema de seguridad, pero estoy usando MVC y estoy manejando todas las rutas url manualmente (solo tratándolas como cadenas), y no relacionándolas con el sistema de archivos, así que estoy bastante seguro de esto. no aplica

También escuché hablar sobre la implementación de un controlador Http personalizado o algo así.

Cualquier pensamiento o idea sería muy apreciado.


Er … ¿por qué? En serio, ¿por qué romper los estándares? – Randolpho

Sugiero, entonces, que investigue la creación de un servicio web. WCF es una buena tecnología para eso, y hospeda bien en IIS.

Me gustan las URL, y WCF es demasiado complicado para mis propósitos. Quiero que sea compatible con url, como REST, pero capaz de algo más que simplemente navegar por jerarquías o hacer cosas bien diseñadas. El problema que tengo con / users / chaiguy es que está interpretando una jerarquía donde no la hay: en mi sistema “usuario” es una clase, no es una carpeta. usuario: chaiguy significa la instancia de la clase de usuario con el valor de “chaiguy”, y que es una entidad única, que tiene el potencial de tener entidades hijo. Así por ejemplo:

/user:chaiguy/name

… Me gustaría mostrar el nombre de esa entidad. Si hiciera esto con su método, se vería así:

/users/chaiguy/name

El problema es ¿cómo sabes cuál es la clase y cuál es el valor? Podría ser interpretado como

/users/chaiguy:name

en mi sistema, y ​​eso no tiene sentido. ¿Ves a lo que me refiero? Para dar un ejemplo un poco más complicado, supongamos que queremos seleccionar un elemento secundario de la entidad de usuario de múltiples instancias. Entonces, un usuario puede tener varias direcciones de correo electrónico. Para seleccionar uno, podríamos usar:

/user:chaiguy/email:me@here.com/

Entonces, de hecho, es recursivo. No es una ruta de archivo, es más como un XPath (o tal vez similar a jQuery basado en lo poco que sé de él). Es decir, es más una selección de consulta evaluada dinámicamente que una ruta de archivo cableada. Se evalúa en el servidor.

No se equivoquen, no estoy construyendo un sitio web típico o incluso un servicio web aquí.

Cambie el atributo requestPathInvalidCharacters de httpRuntime en web.config:

  

y ASP.NET ya no debería bloquear dos puntos desde su ruta de solicitud.

Respondió una pregunta similar aquí: https://stackoverflow.com/a/12037000/134761

Parece que ASP.net no permite dos puntos antes del ‘?’ en una URL, incluso si está codificada como% 3A.

Por ejemplo, estos no funcionarán:

http://foo.org/api/persons/foo:bar

http://foo.org/api/persons/foo%3abar

Pero esto funciona:

http://foo.org/api/persons?id=foo%3abar

En todos los ejemplos, esperaríamos que ASP.NET MVC pase “foo: bar” como un argumento id, decodificado correctamente. Acabo de probar esto con MVC4 y parece funcionar. Sin embargo, es molesto que no acepte la encoding URL antes del signo de interrogación, pero estoy seguro de que hay una buena razón para ello. Probablemente para mantener todo antes del signo de interrogación una URL válida y cualquier argumento después del signo de interrogación.

Intente configurar HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters \ AllowRestrictedChars. Esto es de http://support.microsoft.com/?id=820129 . No sé si ASP.NET/MVC hace algunas comprobaciones por su cuenta, pero si solo es http.sys que lo bloquea, esto debería solucionarlo.

Te sugiero que reconsideres lo que quieres hacer. Use la ruta para indicar el contexto y oculte los nombres de clase y campo, asignando contextos particulares dentro de las rutas de URL a nombres y campos de clase. Si necesita indicar un usuario, por ejemplo, cree su diseño de URL como example.com/users/chaiguy lugar de example.com/user:chaiguy .

En realidad, WCF REST está disponible, y puede comenzar a trabajar fácilmente en una hora utilizando el Kit de inicio de WCF disponible aquí . Esto toma el poder de REST y lo combina con la facilidad de WCF. También con WCF también puede crear su propia capa de transporte si lo necesita para que pueda interpretar las URL de la manera que desee. Una cosa interesante sobre el kit de inicio es que permitió espacios en la Url, lo que en realidad causó algunos dolores de cabeza para verdaderos fondos de REST.

No estaba interesado en verlo debido a WCF, pero realmente no necesita saber tanto. La solución crea todo lo que necesita, solo agregue el código.

Esta configuración web.config funcionó para mí. Acepta dos puntos (:) en la url.

  

Sugeriría usar un punto. REST, basado en el protocolo HTTP, es un ejemplo de creación de un nuevo uso para HTTP que cumplió con los estándares y fue muy exitoso. Quizás puedas hacer eso.

Y un ‘.’ es un estándar ‘class.method’ o ‘class.attribute’ en muchos lenguajes.

Ahora ME, quería usar los dos puntos en los parámetros URL, y algunos lugares lo están haciendo. Todavía tengo que ver si puedo salirse con la tuya.

PD, para mí, puedo usar esto: http://www.businesscasualblog.com/2009/07/how-to-share-a-link-to-a-specific-timecode-in-youtube-video.html

esencialmente ‘–h – m – s’

¿Es un colon válido en una url? Respuesta corta no .

Respuesta larga, sí, si está en un fragmento de URL.

Ejemplo: http://site/gwturl#user:45/comments (note que dos puntos procede de la etiqueta hash)

Fuentes

  • esta respuesta,
  • ¿Es seguro un colon para el uso amigable de URL?
  • junto con una prueba personal de solo agregar : a una url en ASP.NET y obtener el YSOD con A potentially dangerous Request.Path value was detected from the client (:)