¿ Servicios REST con diferente serialización Json ?

Resulta que estos días he estado jugando un poco con WCF y serialización JSON para participar en el nuevo concurso de MSDN http://www.lahoradelospunos.com

En resumen lo que hay que hacer es un Servicio REST accesible desde peticiones HTTP GET que devuelva la secuencia de movimientos conforme el siguiente esquema.

{ “Alias”: “My_alias”, “Moves”: “A1, A2, B1, A1, ME, A1, A2, B1, B2, B1”, “Enemy”: “Enemy_name” }

Pero el problema viene cuando genero la página para acceder manualmente al servicio desde una página web propia y pretendo hacerlo compatible con las llamadas de cliente MS AJAX.

WCF accesible desde ASP.NET AJAX:

Para hacer accesible el servicio y poderlo consumir desde ASP.NET AJAX solo hay que especificar el parámetro Factory de la directiva @ServiceHost en el archivo .svc como WebScriptServiceHostFactory.

image

Desde ese momento la salida de mi objeto JSon tiene el siguiente formato:

{“d“:{“__type“:”Ataque:#KillBits”,”Alias”:”Marckys “,”Enemy”:”Cliente”,”Moves”:”A2,A2,B1,A2,A2,A2,ME,A1,B1,A2″}}

UPSSS!!! no tiene el mismo formato que me piden en el concurso.

Para hacer que el formato cuadre exactamente con las especificaciones del concurso solo tenemos que hacer una cosa. NO hacer compatible el servicio con MS AJAX, solamente con ASP.NET.

WCF accesible desde ASP.NET:

Hay que utilizar WebServiceHostFactory como Factory y no WebScriptServiceHostFactory

image

Formato correcto !!!

{“Alias”:”Marckys “,”Enemy”:”Cliente descontento “,”Moves”:”A1,A1,ME,A1,A1,A1,A2,A2,A2,A2″}

¿Porqué esta diferencia?

Por cuestiones de seguridad desde ASP.NET 3.5 la serialización JSON que tiene que ser consumida desde el cliente “MS AJAX”, viene envuelta en el atributo d. De esta manera se soluciona una conocida vulnerabilidad “javascript hijacking” que permite la ejecución directa de Script en el constructor de arrays de objetos.

Evitando un ataque de este estilo:

["Marckys", alert("Ataque XSS")]

Cuidado al consumir los datos:

Con estas modificaciones en la serialización, tenéis que tener cuidado al obtener el objeto porque no es lo mismo obtener la información con una respuesta u otra.

No es lo mismo esperar el objeto d:

var alias = resultado.d.Alias;

Que utilizarlo directamente:

var alias = resultado.Alias;

Esto puede dar errores al actualizar aplicaciones a las nuevas versiones.

Espero que os haya podido ayudar esta información.

2 comentarios en “¿ Servicios REST con diferente serialización Json ?”

  1. Aunque tarde, me he animado a echarle un vistazo a esto de la hora de los puños, y tenia este mismo problema que comentas con un Ajax-enabled WCF Service con un método con el atributo [WebGet(ResponseFormat = WebMessageFormat.Json)] pero forzando el cambio de Factory desde el markup del svc no me hacia caso, yo lo he solucionado desde el web.config, cambiando el tag enableWebScript por un webHttp en el behavior del endpoint. Otra manera 😉 buen post, un saludo!

Deja un comentario

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