2013-08-02 8 views
1

J'ai un problème de service Web inter-domaine. J'ai lu quelques articles à ce sujet, mais je n'ai pas vraiment trouvé de solution. Je viens de comprendre que j'ai besoin du format json des données, parce que je recevais toujours Error: Access denied. en essayant d'obtenir des données xml du service, mais maintenant j'ai un problème différent. Voici mon .ajax() appel:Appel du service Web à partir de jQuery .ajax() numéro

$.ajax({ 
      type: "GET", 
      contentType: "application/jsonp; charset=utf-8", 
      url: "http://tomas/_vti_bin/EmmaService.asmx/GetResult", 
      dataType: "jsonp", 
      data: { 
       value : "testValue", 
       converstionId : "testId" 
      }, 
      success: function(resp) { 
       alert("success: " + resp); 
      }, 
      error: function (xhr, ajaxOptions, thrownError) { 
       alert("error status: " + xhr.status); 
       alert("error status text: " + xhr.statusText); 
       alert("error response text: " + xhr.responseText); 
      }, 
     }); 

A partir de ce que j'obtiens l'erreur avec 3 alertes suivantes:

error status: 200 
error status text: success 
error response text: undefined 

Ce que je ne comprends pas est error status text: success.

code dans mon service web:

[WebMethod(EnableSession = false, Description = "Gets result")] 
    public EmmaServiceResult GetResult(string value, string converstionId) 
    { 
     ... 
     return result; 
    } 

Toutes les suggestions sur la façon d'obtenir ce travail? Merci! :)

+0

Remarque: Je ne peux pas modifier le service Web, il est utilisé par d'autres solutions, et je dois l'appeler correctement et travailler sans aucun code, juste javascript, parce que je crée une application SharePoint 2013, qui ne permet pas le code derrière:/ –

+0

Pouvez-vous exécuter cela à l'intérieur de Firebug sur Firefox et/ou Chrome Web Inspector, puis couper et coller l'ensemble de la demande (dans le texte) et la réponse (idem) dans la question? – deitch

+0

Vérifiez la console javascript et l'onglet réseau dans les outils de développement de votre navigateur. Cherchez les erreurs et regardez la réponse de xhr pour voir si c'est ce que vous attendez. –

Répondre

2

Essayez d'ajouter ?callback=? à la fin de votre URL:

http://tomas/_vti_bin/EmmaService.asmx/GetResult?callback=? 

Aussi, essayez de regarder le thrownError pour déterminer ce que l'erreur est:

alert("error response text: " + thrownError); 

Il pourrait y avoir une erreur d'analyse syntaxique , etc .. quelque chose qui n'est pas réellement lié à la requête ajax, mais comment vous définissez comment la réponse doit être gérée.

De plus, regardez here pour voir comment retourner json à partir d'un service WCF.

[WebInvoke(Method = "GET", 
      RequestFormat = WebMessageFormat.Json, 
      ResponseFormat = WebMessageFormat.Json, 
      UriTemplate = "players")] 
+0

Je l'ai changé en' xhr.thrownError' et il renvoie toujours 'undefined':/ –

+0

désolé, j'ai édité ma réponse. Essayez juste ThrownError –

+0

maintenant je reçois le texte de réponse d'erreur: jQuery ... beaucoup de nombres ... n'a pas été appelé –

0

J'ai récemment rencontré de nombreux problèmes lors de la création d'une requête interdomaine à partir d'un appel AJAX. Nous avons fini par le faire fonctionner sans avoir à modifier l'API, mais nous avions besoin d'accéder au serveur hébergeant l'API afin de pouvoir envoyer des en-têtes dans la réponse. Mais l'ensemble de la question a été une peine à déboguer, et j'ai trouvé que tous les navigateurs étaient terribles de signaler des erreurs significatives. Donc potentiellement cela pourrait ne pas fonctionner pour vous et des excuses à l'avance si cela ne règle pas votre problème.

La solution nécessite que vous effectuiez une requête CORS et que vous ajoutiez des en-têtes à la réponse de votre serveur. Ces pages ont été deux bonnes ressources:

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS http://www.html5rocks.com/en/tutorials/cors/

Je pense que dans votre cas, puisque vous faites une demande de base et vous n'êtes pas traiter avec les cookies, vous pouvez laisser votre appel .ajax essentiellement inchangé , changeant juste dataType en "json" et contentType en "application/json" si vous envoyez JSON.

Vous devrez alors modifier le serveur pour avoir gérer la demande en ajoutant prévol CORS ces en-têtes à la réponse:

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET 
Access-Control-Allow-Headers: Content-Type 

(Voir cette question: jQuery CORS Content-type OPTIONS)

Espérons que cela travailler pour vous!

Questions connexes