Voici un problème qu’on rencontre souvent en essayant d’accéder à un web service à partir d’une application Silverlight, le web service étant déployé sur http://localhost:xxxx/… et la page contenant l’application Silverlight est déployée sur http://localhost:yyyy/… (Ce qui est le cas lorsqu’on travaille avec le serveur web de visual studio), voici le message d’erreur qu’on obtient :
An error occurred while trying to make a request to URI 'http://localhost:xxxx/Service1.svc'. This could be due to 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.
Le problème se pose tout simplement parce qu’on n’est pas dans le même domaine et une application client (comme Silverlight ou AJAX) ne peut appeler des services que s’ils appartiennent au même domaine.
Pour remédier à cela on peut tout simplement déployer notre application sur IIS sous le même domaine et abandonner le développement sur le serveur web de visual studio. Mais on peut aussi forcer le service à accepter des appels en cross domain, il suffit d’ajouter à la racine du projet contenant le service web les deux fichiers XML suivants :
crossdomain.xml
1: <?xml version="1.0"?>
2: <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
3: <cross-domain-policy> <allow-http-request-headers-from domain="*" headers="*"/>
4: </cross-domain-policy>
clientaccesspolicy.xml
1: <?xml version="1.0" encoding="utf-8"?>
2: <access-policy>
3: <cross-domain-access>
4: <policy>
5: <allow-from http-request-headers="*">
6: <domain uri="*"/>
7: </allow-from>
8: <grant-to>
9: <resource path="/" include-subpaths="true"/>
10: </grant-to>
11: </policy>
12: </cross-domain-access>
13: </access-policy>