2010-04-28 6 views
1

EDIT: Au début, je pensais que ce n'était pas interdomaine fonctionne pas du tout, maintenant je me rends compte qu'il ne fonctionne que dans IEdomaine croix jsonp ne fonctionne pas dans IE

J'utilise jQuery pour appeler un service web (ASP.NET .axmx), et en essayant de nous jsonp afin que je puisse l'appeler à travers différents sites. En ce moment, il fonctionne UNIQUEMENT dans IE, mais pas dans Firefox, Chrome, Safari. En outre, dans IE, une boîte de dialogue affiche un avertissement "Cette page accède à des informations qui ne sont pas sous son contrôle ..." Des idées?

Voici le code:

$.ajax({ 
    type: "POST", 
    url: "http://test/TestService.asmx/HelloWorld?jsonp=?", 
    dataType: "jsonp", 
    success: function(data) { 
     alert(data.prop1); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
     alert(XMLHttpRequest.status + " " + textStatus + " " + errorThrown); 
    } 
}); 

Et le code du serveur est:

[ScriptService] 
public class TestService : System.Web.Services.WebService{ 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public void HelloWorld() { 
     string jsoncallback = HttpContext.Current.Request["jsonp"]; 
     var response = string.Format("{0}({1});", jsoncallback, @"{'prop1' : '" + DateTime.Now.ToString() + "'}"); 
     HttpContext.Current.Response.Write(response); 
    } 
} 
+1

Pouvez-vous nous montrer comment vous faites l'appel (je suppose que vous vous injectez l'élément de script approprié) du côté jQuery? –

+1

Cela peut être un refrain, donnant tout ce qui se passe, mais pourquoi spécifiez-vous POST plutôt que GET? –

+0

@Matt Gibson ... ça marche! Si vous voulez l'écrire comme réponse, je l'accepterai. Pourquoi serait-ce important? – iboeno

Répondre

2

Heureux que ça marche maintenant.

Vous essayez d'envoyer le paramètre "jsonp" - que vous devez passer pour la partie "remplissage" de json - en tant que paramètre GET, c'est-à-dire dans la chaîne d'URL. Quelle est la bonne chose à faire. Mais parce que vous avez spécifié le POST, cela ne se produit pas. En effet, comme vous spécifiez POST, le serveur s'attend à ce que tous les paramètres soient dans les données POSTed, pas dans les variables GET, donc il ne vérifie pas l'URL pour récupérer le paramètre.

Je pense qu'il est possible que jQuery soit très tolérant/intelligent sur la façon dont il fait l'évaluation JSON, et travaille donc encore dans IE, car (a) si le serveur ne lit pas la variable "jsonp", je pense il renvoie "({'prop1' : '<today's date>'})", qui est toujours évaluable en tant que JSON, et (b) IE n'a pas les mêmes restrictions sur les scripts intersites (politique de "même origine") que les autres navigateurs. Mais j'ai besoin de déboguer pour être sûr. Je suggère d'utiliser FireBug dans Firefox pour déboguer ce qui se passe avec ce genre de requête à l'avenir, mais l'essentiel à retenir est que si vous envoyez des paramètres dans le cadre de l'URL, utilisez GET, pas POSTER.

Cheers,

Matt

+0

Merci pour l'explication! – iboeno

0

À moins que vous spécifiez le jsonp et/ou l'option jsonpCallback, jQuery génère automatiquement le nom de la fonction pour vous et ajoute un paramètre de requête comme callback=jsonp1272468155143. Ce qui signifie que votre application doit sortir en utilisant ce nom de fonction.

Vous pouvez toujours définir jsonpCallback à test, auquel cas votre exemple fonctionnera.