2010-04-23 6 views
18

J'essaie de acess un service WCF d'un client jQueryaccès au service Web de jQuery - cross domain

Plus précisément cet exemple http://www.codeproject.com/KB/aspnet/WCF_JQUERY_ASMX.aspx#4

Tout fonctionne bien lorsque la page Web client est sur le même domaine que le service

Dès que je déplace la page Web client vers un autre domaine, il se brise. Il ne peut pas atteindre le service et la demande ne

Cela se produit pour tous les exemples, ASMX, REST et WCF

des idées sur la façon d'obtenir cette croix de travail daomain?

Répondre

10

Vous exécutez la stratégie Same-Origin. Le service Web auquel vous accédez doit résider sur le même domaine que le script jQuery qui effectue la requête. Cette stratégie est appliquée par tous les navigateurs pour empêcher, par exemple, les attaques par script intersite et par injection de code sur les applications Web.

Il existe plusieurs façons de contourner cela, y compris JSONP, Proxies ou Flash.

Nous aurons besoin d'un peu plus d'informations avant de pouvoir suggérer quelle technique vous devriez utiliser. J'ai tendance à favoriser JSONP. Mais en attendant, voici une lecture légère:

http://taossa.com/index.php/2007/02/08/same-origin-policy/

https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript

Voici un exemple d'utilisation JSONP:

url = "http://www.test.com/getData.php?callback=parseResults"; 

document.body.appendChild((function() { 
    var newScript = document.createElement("script"); 
    newScript.type = "text/javascript"; 
    newScript.src = url; 
    return newScript; 
})()); 

function parseResults(data) { 
    alert(data); 
} 
+0

L'idée est-elle que vous effectuez des appels ajax à un service sur le même domaine et que les demandes sont transmises au service prévu? Mais le fait à partir du code côté serveur qui n'a pas le genre de restrictions imposées par un navigateur? – ChrisCa

+3

Si vous parlez d'utiliser un proxy, alors oui, c'est exactement ça. La SOP est appliquée par le navigateur, donc PHP, ASP, ColdFusion et ainsi de suite ne sont pas liés. Votre JS fait la demande au proxy, le proxy envoie la demande au service, puis le proxy transmet le résultat au JS. – GlenCrawford

+0

Je devrais probablement souligner que l'utilisation d'un proxy peut augmenter légèrement le trafic et les temps d'attente, parce que vous faites maintenant deux demandes au lieu d'une.JS -> Proxy -> Service – GlenCrawford

1

Vous pouvez consulter JSONP (JSON with Padding). En bref, il s'agit d'ajouter un élément de script à la page avec l'URL du service Web comme src. Le service Web encapsule ensuite le JSON en tant que premier argument dans une fonction de rappel, qui est exécutée lorsque le script est analysé.

éléments de script sont exemptés de l'Same Origin Policy, ce qui est la façon dont ils sont en mesure de contourner ce problème ..

+0

serait l'ajout d'un CrossDomain.XML être utile? Ou n'est-ce pas si simple? – ChrisCa

+2

@Christo Fur: l'ajout d'un fichier crossdomain.xml au domaine sur lequel réside le service Web permettra aux applications Flash de faire des requêtes intersites à l'API, si le fichier XML autorise le domaine sur lequel réside l'application Flash (plus d'informations : http://jimbojw.com/wiki/index.php?title=Cross-domain_Ajax_via_Flash) – GlenCrawford

+0

@Christo Fur: + Ce que RoseOfJericho a dit. Vous pouvez regarder dans les en-têtes 'Access-Control', mais ils ne sont pas largement supportés par les navigateurs (peut-être seulement Fx) et IE8 vous oblige à utiliser' XDomainRequest() 'au lieu de' XMLHttpRequest() '. JSONP est vraiment votre meilleure option pour la compatibilité de x-navigateur. –

0

En général, vous ne pourrez; les navigateurs modernes limitent cela pour empêcher les attaques par script intersite. Un moyen de contourner cela peut être d'utiliser JSON "padded", JSONP, qui insère les résultats dans un élément de script sur votre page. Il y a un Microsoft WCF sample here qui semble faire cela.

0

J'ai fait face au même problème pendant 2 jours et j'ai trouvé la solution, et c'est élégant après avoir beaucoup googlé. J'avais besoin de xss Ajax pour certains clients de widget qui tirent le flux de données de sites tiers vers mon application Rails. here's how I did.

+0

C'est juste JSONP résoudre votre problème. Vous n'avez pas du tout à l'emballer dans un objet DOM. –