WCF, REST & Manejo de Caracteres Especiales

abril 2, 2009
By

Supongamos que tenemos implementado el patrón REST utilizando WCF (Windows Communication Foundation) y queremos asociar un recurso determinado a algún usuario de la siguiente forma:

[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "GetResource/{user}")]
Stream GetResource (string user);

Para consumir el recurso del usuario “User1” utilizamos la siguiente URL:

http://server/servicio.svc/GetResource/User1

Pero en una red con varios dominios deberíamos identificar al usuario como “DOMAIN\User1”. Sorprendentemente cuando utilizamos esa nomenclatura, el servidor retorna:

400 – Bad Request

Si utilizamos User@domain todo vuelve a funcionar como se esperaba. Por tanto, ¿Cuál es el misterio del \ (Backslash)?

Luego de navegar unas cuantas horas por internet, descubrí que ASP.NET bloquea el uso de “caracteres especiales” en la URL por razones de seguridad:

Microsoft KB Article 826437 http://support.microsoft.com/kb/826437/en-us)

Después de modificar el registro utilizando el código siguiente pude utilizar el Backslash:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET]
“VerificationCompatibility”=dword:00000001

Sin embargo, todo no terminó aquí. Se me ocurrió luego utilizar la siguiente sintaxis:

http://server/servicio.svc/GetResource/<User1>

Quizás para este caso en particular no tenga sentido la utilización de <> pero supongamos que por alguna razón necesitamos la utilización de esa sintaxis. Como deberán estarse imaginando el “400 Bad Request” volvió a hacer de las suyas. Lo más gracioso es que supuestamente ya habíamos permitido los caracteres especiales… pues nada, a navegar por internet nuevamente :)

Luego de otro par de horas de investigación me encontré un POST en Microsoft Connect donde aclaraban que ASP.NET prohíbe el uso de los caracteres “<” y “>” en la URL producto de que pueden ser utilizados para inyectar código maligno.

Estando así las cosas, me puse a jugar con el UriTemplate para ver si encontraba alguna solución alternativa y adivinen que sucedió: ASP.NET prohíbe el uso de los caracteres “<” y “>” localizados antes del “?” pero si los permite en la región del query string.

[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "GetResource/?u={user}")]
Stream GetResource (string user);

Al efectuar el llamado http://server/servicio.svc/GetResource/?u=<User1> se obtiene el resultado esperado.

NOTA: La desventaja de utilizar la región del query string para implementar el patrón REST es que dicha región se considera dinámica por lo que algunos sistemas de cache (Web Servers, Proxy Servers) descartan, por diferentes motivos, esa información a la hora de almacenar localmente el recurso. Por tanto, si almacenar en caché (independientemente de la implementación del servidor de cache) es un requerimiento, entonces habría que valorar el uso del “?” para identificar el recurso.

Tags: , , ,

One Response to WCF, REST & Manejo de Caracteres Especiales

  1. paneque on abril 2, 2009 at 9:46 pm

    Usar GetResource/{user}/{domain} te resuelve el problema. asumiendo que pretendes usar ese tipo de estructura siempre.

    Pero si quieres usar ? sin que nadie lo sepa entonces UrlRewriter es la solucion. tu servicio usa la URL que quieras, y el frente puede lucir como http://…/GetResource/tamayo/weboo.aspx etc etc.

    Los buscadores muchas veces restan importancia a las paginas que solo diferencian en el query string. Visiten http://www.findsatnavdeals.com/ y veran que no aparece una ? por ahi, pero se usan internamente, todas las paginas usan varios parametros, solo que los escondo para que el sitio tenga buen rating, de hecho tiene un PR bastante alto. :) solo hay que escribir unas expresiones regulares en el web.config y listo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Acerca del autor...

Alejandro Tamayo

Web: http://www.linkedin.com/in/atamayocastillo
Alejandro Tamayo
Professor, Researcher, Developer, Consultant and technology enthusiast. Master of Science (MSc) in Computer Science and member of Weboo Research Group.Leer completo