Samstag, 10. April 2010

Cross domain calls for Silverlight client

Ein Silverlight Client lässt standardmäßig nur den Aufruf von Webservices aus der Web-Domäne zu, von der der Silverlight-Client herunter geladen wurde. In manchen Fällen möchte man aber zum Beispiel einen Webservice per WCF (SOAP) aufrufen oder einen POX- bzw. REST-konformen Call per WebClient oder HttpRequest machen. Um dies zu ermöglichen, müssen in der aufgerufenen Domäne im Root die zwei Dateien clientaccesspolicy.xml und ggf. auch crossdomain.xml vorhanden sein.

In meinem konkreten Szenario hatte ich ein Windows Azure-Projekt mit mehreren Web-Roles. Da jede Web-Role (bei mir eine Webservice-Role) eine eigene Adresse hat, ist jeder Aufruf vom Silverlight-Client ein Cross Domain Access. Wenn man nun die unten beschriebene Policy-Datei clientaccesspolicy.xml  in das WebService-Projekt im Root anlegt, erlaubt man Silverlight auch auf diesen WebService außerhalb seiner Download-Domäne zuzugreifen.

Die Policy-Datei crossdomain.xml ist eine Alternative, dessen Format ursprünglich von Adobe Flash kommt. Im Unterschied zur clientaccesspolicy.xml muss man in dieser Datei den Zugriff von jeder beliebigen Domäne auf den Webservice erlauben. Macht man dies nicht, wird der Cross domain call von Silverlight nicht akzeptiert.

In der clientaccesspolicy.xml kann man hingegen, den Zugriff auf den Webservice von bestimmten Domänen einschränken (allow-from->domain). Ist also die Verwendung dieser Policy-Datei zu präferieren.

clientaccesspolicy.xml
<?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>
crossdomain.xml
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Bei beiden Dateien müssen, damit diese auch in die Silverlight XAP gepackt werden, die Attribute Content und Copy if newer gesetzt werden.

Keine Kommentare:

Kommentar veröffentlichen