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.
[sourcecode language=»javascript»]
{
"Alias": "My_alias",
"Moves": "A1, A2, B1, A1, ME, A1, A2, B1, B2, B1",
"Enemy": "Enemy_name"
}
[/sourcecode]
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.
Desde ese momento la salida de mi objeto JSon tiene el siguiente formato:
[sourcecode language=»javascript»]
{
"d":
{
"__type":"Ataque:#KillBits",
"Alias":"Marckys ",
"Enemy":"Cliente",
"Moves":"A2,A2,B1,A2,A2,A2,ME,A1,B1,A2"
}
}
[/sourcecode]
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
Formato correcto !!!
[sourcecode language=»javascript»]
{
"Alias":"Marckys ",
"Enemy":"Cliente descontento ",
"Moves":"A1,A1,ME,A1,A1,A1,A2,A2,A2,A2"
}
[/sourcecode]
¿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:
[sourcecode language=»csharp»]["Marckys", alert("Ataque XSS")]
[/sourcecode]
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:
[sourcecode language=»csharp»]var alias = resultado.d.Alias;
[/sourcecode]
Que utilizarlo directamente:
[sourcecode language=»csharp»]var alias = resultado.Alias;
[/sourcecode]
Esto puede dar errores al actualizar aplicaciones a las nuevas versiones.
Espero que os haya podido ayudar esta información.