2009-02-17 8 views
3

Est-il possible d'effectuer un appel intersite, en Javascript, vers un service WCF?Appel ajax inter-site à un service WCF

Cela ne me dérange pas si c'est un POST ou un GET.

Mais j'ai entendu dire que ces jours-ci, les navigateurs ne permettent pas les appels inter-sites avec POST ou GET.

Comment est-ce que je peux contourner ceci et appeler toujours un WCF Service?

Répondre

5

Il n'y a pas grand-chose à faire pour contourner les bloqueurs de scripts intersites du navigateur. Ces bloqueurs empêchent XMLHTTPRequest d'arriver à n'importe quel domaine sauf celui qui a chargé le script ou la page contenant. Cela dit, il existe une solution de contournement couramment utilisée: Utilisez JavaScript pour écrire une nouvelle entrée dans le DOM qui fait référence à un src qui est une URL inter-site. Vous passerez tous vos arguments de méthode RPC à ce "script" qui retournera du code JavaScript qui sera exécuté, vous indiquant le succès ou l'échec.

Il n'y a aucun moyen de faire un POST de cette manière, l'URL src doit être un GET, donc vous pouvez passer des arguments de cette façon. Je ne suis pas sûr si WCF a une méthode d'accès "GET seulement". Et puisque le navigateur s'attend à ce que le résultat de la balise distante soit un objet JavaScript valide, vous devrez vous assurer que votre service WCF l'accepte également, sinon vous obtiendrez des erreurs JavaScript.

Une autre méthode courante de contournement des scripts inter-sites consiste à écrire un proxy pour vos demandes. En d'autres termes, si vous souhaitez accéder au domaine test.com à partir de scripts hébergés sur example.com, créez une URL sur example.com qui envoie la requête à test.com de la bonne manière.

Pour votre exemple, le proxy est probablement la bonne réponse, en supposant que WCF n'a pas ses propres restrictions de script intersite.

4

Utilisez-vous jQuery par hasard? jQuery prend en charge les requêtes JSON inter-domaines à l'aide de "JSONP". Vous serez limité aux demandes GET, mais j'ai essayé et cela fonctionne bien! C'est aussi très simple de travailler.

Voir la "Cross-Domain getJSON (en utilisant JSONP)" section sur cette page pour plus de détails: http://docs.jquery.com/Release:jQuery_1.2/Ajax

Et voici quelques informations générales sur JSONP: http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/

Permettez-moi de savoir comment il va!

1

Pour développer la réponse de Ben ... J'étendu notre service WCF pour soutenir JSONP appels de jQuery en utilisant un code similaire à cet exemple de Microsoft:

http://msdn.microsoft.com/en-us/library/cc716898.aspx

+0

Comment avez-vous réussi à faire cela? J'ai utilisé exactement le même exemple de code, mais lorsque j'ai essayé de l'intégrer dans mon application, je me suis retrouvé coincé avec les points de terminaison dans web.config. J'ai continué à recevoir des erreurs sur les "liaisons" manquantes, même si j'ai copié toutes les liaisons de l'échantillon. – Jonathan

2

Nouvelles recommandations du W3C sont en cours de normalisation pour permettre croix demandes de site entre des parties de confiance via la spécification Access Control for Cross-Site Requests.

Cela nécessite un serveur desservant des en-têtes HTTP Access Control appropriés et un navigateur capable de comprendre et d'agir sur de tels en-têtes. En bref, si un hôte distant dit qu'il aime votre domaine et qu'un navigateur comprend ce que cela signifie, vous pouvez effectuer xmlHttpRequests contre cet hôte quelle que soit la même politique d'origine.

Actuellement, très peu de navigateurs prennent en charge cette fonctionnalité. IE8 semble le faire (je ne l'ai pas testé) et Firefox 3.1 le fait (je l'ai testé intensivement). Je m'attends à ce que les autres navigateurs suivent assez rapidement.

Vous ne devriez pas vous attendre à une adoption suffisante des navigateurs compatibles avant 2012 au plus tôt.

Voilà la solution ultime au problème. L'inconvénient est d'attendre quelques années avant qu'il peut être utilisé dans les applications grand public. Si cela est utilisé dans un environnement que vous contrôlez entièrement, par exemple pour un intranet où vous pouvez déterminer quel navigateur est utilisé et où vous pouvez configurer plusieurs serveurs pour émettre les en-têtes appropriés, cela fonctionne parfaitement.

Questions connexes