clientaccesspolicy.xml et WCF

Si l’on tente d’accéder à un service WCF depuis une application Silverlight et que service et application sont installés sur des serveurs différents (petit piège classique : localhost est différent du nom de votre machine !), on risque de rencontrer ce type d’erreur :

Une erreur s’est produite en tentant d’effectuer une demande à l’URI ‘http://MonSite/MonRepertoireVirtuel/MonService.svc’. Ce problème peut être dû à une tentative d’accès à un service entre domaines sans qu’une stratégie entre domaines appropriée soit en place, ou une stratégie inadaptée aux services SOAP. Il est possible que vous soyez contraint de contacter le propriétaire du service pour publier un fichier de stratégie entre domaines et veiller à ce qu’il autorise l’envoi d’en-têtes HTTP SOAP. Cette erreur peut également être liée à l’utilisation de types internes dans le proxy de service Web sans utiliser l’attribut InternalsVisibleToAttribute. Consultez l’exception interne pour plus de détails.

Le message est assez explicite, le client Silverlight n’est pas autorisé à accéder au service WCF.
En scrutant avec Fiddler, on s’apercoit que Silverlight fait appel à un fichier clientaccesspolicy.xml.
On doit donc rajouter un fichier clientaccesspolicy.xml à la racine de son IIS (racine de IIS et non pas de son site).

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

Une fois que nous avons positionné et vérifié avec Fiddler que le fichier est bien prise en compte, on peut encore rencontrer la même erreur. Cette fois ci nous avons affaire à un problème dans la configuration du fichier clientaccesspolicy.xml que nous venons de rajouter. En effet, il n’accepte pas encore les Header de type SOAP (WebService). Rajoutons donc dans la balise allow-from un attribut http-request-headers= »SOAPAction » :

  <?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>

Voila qui devrait fonctionner !

EDIT : Si vous utilisez un serveur basé sur Linux pour stocker votre fichier « clientaccesspolicy.xml », faites bien attention à la casse !
En effet, si pour serveur Window les nom de fichier « clientaccesspolicy.xml » ou « ClientAccessPolicy.xml » sont identitiques ce n’est pas le cas pour un systeme Linux. Par defaut Silverlight recherche le fichier « clientaccesspolicy.xml », je vous conseille donc de conserver ce nom de fichier sans casse quelque soit la nature de votre serveur.

3 Responses to clientaccesspolicy.xml et WCF

  1.  

    Joli post.
    J’ai une question: peux-tu préciser où se trouve t-il la racine de IIS? Est-ce C:\Inetpub\wwwroot?

  2. Oui, par défaut c’est bien cela.
    Si votre site se trouve ailleurs, il faut positionner le fichier à la racine du site (sans prendre en compte les répertoires virtuels).

     
  3.  

    Poste très utile, ça m’a débloqué merci !

leave your comment