Accediendo a Servicios Web Cross-Domain desde Silverlight


Después de un rato sin escribir, retomaré con algunos temas bastante interesantes, este es el primero de ellos.

Lo más común cuando desarrollamos un aplicación sobre silverlight es que esta tenga un servicio el cual le entrega los datos y la lógica del negocio, por comodidad el servicio siempre se encontraba en la aplicación web que hospedaba la aplicación de silverlight (o por lo menos así lo hacia yo para evitarme mayores problemas :$) , para estos casos la aplicación funcionaba perfectamente, pero cuando el servicio no se encontraba en este directorio era toda una odisea hacerlo funcionar!…

¿Cómo funcionan el acceso a los servicios Cross-Domain?

Cuando silverlight accede a un servicio web lo primero que verifica es el dominio en donde este se encuentra hospedado, si este se encuentra en un domino diferente al propio busca un par de archivos; el primer es el clientaccesspolicy.xml si este no existe silverlight buscará crossdomain.xml; estos archivos deben estar en la raíz del dominio en donde se hospeda el servicio web.

Los servicios más comunes en internet como Twitter, Amazon, Youtube disponen de archivos crossdomain.xml en la raiz de su dominio (Twitter tiene algunas restricciones en este archivo – Gracias Rodrigo)

Además de este hecho tener el servicio y el cliente de silverlight en un mismo directorio no es lo más seguro.

Manos a la Obra!

Después de tener listo nuestro servicio web (En otro proyecto obviamente) y tener creado nuestro cliente de silverlight dispuesto a consumir dicho servicio tendremos que crear el siguiente archivo.

El cual debe estar en la Raíz del Dominio en donde se hospeda el servicio web.

   <?xml version="1.0" encoding="utf-8"?>
   <access-policy>
      <cross-domain-access>
         <policy>
            <allow-from http-request-headers="*">
               <domain uri="*"/>
            </allow-from>
            <grant-to>
               <resource path="/" include-subpaths="true"/>
            </grant-to>
         </policy>
       </cross-domain-access>
   </access-policy>

Con esta configuración cualquier dominio podrá acceder a todos los recursos que se encuentran en el dominio actual.

Si el acceso al servicio se realiza sobre HTTPS desde un cliente en HTTP debe colocar la siguiente configuración entre los elementos <allow-from></allow-from>

<allow-from http-request-headers="*">
   <domain  uri="http://*"/>
</allow-from>

Es de anotar que Silverlight 4 nos evita esta configuración SI y SOLO SI el cliente de silverlight esta corriendo fuera del explorador con permisos Elevated-Trust (Como si se tratase de una aplicación windows común corriendo con privilegios).

Para ampliar mas información sobre este tema pueden visitar.

http://msdn.microsoft.com/es-es/library/cc197955%28VS.95%29.aspx

Hasta la Próxima.

Juan Manuel Lombana

Anuncios