Usando dos puntos(:) en una url con ASP.NET/IIS
httphandler colon (8)
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 de 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 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:[email protected]/
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í.
Esta configuración web.config funcionó para mí. Acepta dos puntos (:) en la url.
<httpRuntime targetFramework="4.6.1" requestPathInvalidCharacters=""/>
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.
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.
Cambie el atributo requestPathInvalidCharacters
de httpRuntime
en web.config:
<httpRuntime maxRequestLength="20480" requestValidationMode="2.0" requestPathInvalidCharacters="" maxQueryStringLength="20480" />
y ASP.NET ya no debería bloquear dos puntos desde su ruta de solicitud.
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''
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
.
Respondió una pregunta similar aquí: https://.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 codificación 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.
¿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 conA potentially dangerous Request.Path value was detected from the client (:)