Like This!

Hoy estuvimos consumiendo servicios WCF desde una aplicación silverlight. Todo se hace del mismo modo que cuando consumes servicios WCF desde ASP.NET. Sin embargo, hay que tener en cuenta unas cosas adicionales para evitar el siguiente error al momento de ejecutar el llamado al servicio:

System.ServiceModel.CommunicationException

An error occurred while trying to make a request to URI ‘https://domain/folder/Service.svc’. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. Please see the inner exception for more details.

Esto sucede porque Silverlight implementa algunas medidas de seguridad para evitar que una aplicación desconocida pueda acceder a los servicios que estamos exponiendo. Por defecto, las aplicaciones SilverLight no van a acceder a servicios por fuera de su dominio, éstos rechazarán esos llamados.

Hay dos soluciones fáciles y muy lógicas para eso que las pueden encontrar en el artículo Making a Service Available Across Domain Boundaries en MSDN. Por lo pronto acá te doy una de ellas.

Se usa un archivo llamado clientaccesspolicy.xml en la raiz del proyecto que hospeda los servicios. Ese archivo debe tener la siguiente estructura:

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

Por defecto esta estructura permitirá el acceso desde cualquier dominio. Se debe cambiar la línea

 domain uri="*"/>

por

 domain uri="http://midominio:8888/"/>

Y listo, empieza a probar ya terminar tu proyecto que pa’ntier es tarde.