2009-05-28 8 views
2

fait de mon mieux pour comprendre cela correctement. Quelle est la différence entre une réponse XML, SOAP et JSON? Et comment sait-on comment appeler un service web dont la réponse est l'une des réponses ci-dessus? (... S'il vous plaît corrigez-moi si je suis hors-piste)problème avec l'appel à distance ASMX en utilisant jQuery

La raison pour laquelle je demande cela parce que j'essaie d'appeler un ASMX à distance de jQuery dans ma webapp .NET3.5, et pas de chance du tout !! En fait, je suis en train d'appeler une méthode ConvertisseurDevises comme indiqué à l'adresse suivante: http://www.webservicex.net/CurrencyConvertor.asmx?op=ConversionRate

Je peux voir qu'il retourne XML, mais le code suivant ne fonctionne pas:

$('#Currency').bind('change', function() { 
    var targetDiv = '#Result' 
    var currencyValue = $('#Currency option:selected').attr('value') 
    var webMethod = 'http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate' 
    var parameters = "{'FromCurrency':'GBP','ToCurrency':'" + currencyValue + "'}" 

    $(targetDiv).html('loading...'); 

    $.ajax({ 
     type: "POST", 
     url: webMethod, 
     data: parameters, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(response) { 
      $(targetDiv).html(response.d); 
     }, 
     error: function(response) { 
      $(targetDiv).html("Unavailable:" + response); 
     } 
    }); 
}); 

S'il vous plaît quelqu'un pourrait me aider à cette , comme je suis vraiment perdu!

Merci!

+0

Si vous définissez dataType: texte et alerter la variable de réponse dans la routine de succès, il ne semble que JSON ou XML? – James

+0

Il est plus facile de demander à FireBug ou à Fiddler de regarder de plus près. –

+0

Salut James. Merci pour la réponse! Juste essayé, mais toujours rien ... l'étiquette # Résultat reste sur "Chargement ..." – Shalan

Répondre

4

J'ai déjà utilisé ce service Web. Il attend et renvoie XML. Voici le code que j'ai utilisé pour travailler dans Internet Explorer (Pour Firefox, vous devez utiliser jsonp).

$('#Currency').bind('change', function() { 
    var targetDiv = '#Result' 
    var currencyValue = $('#Currency option:selected').val(); 
    var webMethod = 'http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate'; 
    var parameters = "?FromCurrency=GBP&ToCurrency=" + currencyValue; 

    $(targetDiv).html('loading...'); 

    $.ajax({ 
     type: "GET", 
     url: webMethod + parameters , 
     contentType: "text/xml; charset=utf-8", 
     dataType: "xml", //for Firefox change this to "jsonp" 
     success: function(response) { 
      $(targetDiv).html(response.text); 
     }, 
     error: function(xhr, textStatus, errorThrown) { 
      $(targetDiv).html("Unavailable: " + textStatus); 
     } 
    }); 
)}; 
+0

Salut Jose! Merci pour cela. Je vois un peu de lumière maintenant ... quand je change la valeur selectedValue de l'élément select, je vois "attendre www.webservicex.net" flash pendant environ une seconde, puis rien :( – Shalan

+0

dans la barre d'état que je voulais dire – Shalan

+0

Avez-vous testé dans IE? Je ne sais pas si cela fonctionne en FF –

0

Le problème concerne l'affichage intersite. Vous pouvez obtenir l'erreur "Access to restricted URI denied code: 1012" parce que vous postez sur un WebService dans un autre domaine.

S'il vous plaît se référer ce post sur Error 1012

+0

J'ai pensé autant, mais alors ne devrais-je pas avoir une réponse avec cette erreur dans mon alerte (selon la suggestion de James ci-dessus)? Existe-t-il un autre moyen de le faire? Je sais qu'il doit y avoir, car c'est pourquoi ces services sont là - à consommer! :) – Shalan

+0

Cette erreur n'apparaît pas dans la réponse car l'appel au service Web ne se produit même pas. L'erreur apparaît dans Firebug. Consultez cet autre post: http://stackoverflow.com/questions/51283/access-to-restricted-uri-denied-code-1012 – ichiban

2

[Modifier] Une autre chose que vous pourriez essayer est de changer le dataType dans le à « xml » appel JQuery. Si cela ne fonctionne pas, vous pouvez créer votre propre service Web proxy qui appelle le serveur distant, puis renvoyer les données au format JSON. Je pense que le problème est dans le code côté serveur. Je ne suis pas sûr si cela fonctionnera pour vous mais voici un code de travail qui montre JQuery appelant mon WebMethod. J'espère que vous pouvez comparer cela avec le vôtre et le faire fonctionner. Dites-nous quelle est la solution. J'espère que ça aide.

[Server Code] 

using System; 
using System.ComponentModel; 
using System.Data; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

[WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ToolboxItem(false)] 
    [ScriptService] 
    public class ForumService : System.Web.Services.WebService 
    { 

     [WebMethod] 
     [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] 
     public VoteCastResult CastQuestionVote(string itemID, QAForum.Bll.VoteType voteType) 
     { 
      try 
      { 
       User usr = SecurityHelper.GetOrCreateUser(); 
       Guid question = new Guid(itemID); 
       return new QuestionVoteController().CastQuestionVote(usr, question, voteType); 
      } 
      catch (Exception ex) 
      { 
       return new VoteCastResult(VoteCastStatusType.otherIssue, 0, ex.Message); 
      } 
     } 
    } 


[JQuery Code] 

    function AFTopicCastVote(clickContext, itemID, voteDirection, voteMethod) 
    { 
      $.ajax({ 
      type: "POST", 
      contentType: "application/json; charset=utf-8", 
      url: (AFServiceUrl + voteMethod), 
      data: "{'itemID': '" + itemID + "','voteType': '" + voteDirection + "'}", 
      dataType: "json", 
      success: function (data, textStatus) { 
           AFTopicProcessVoteResult(clickContext, data.d); 
           //alert("data : " + data.d); 
          }, 

      error: function ( XMLHttpRequest, textStatus, errorThrown) 
      { 
      alert("error casting vote: " + errorThrown); 
      } 
     });  
    } 
+1

Ceci est un service web externe public pas sous son contrôle – ichiban

+0

ichiban: Good catch, i mettra à jour mon commentaire. – James

1

en page par la fonction de charge ajouter les lignes suivantes pour un client ....

 base.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
     base.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 
     base.Response.AddHeader("Access-Control-Allow-Headers", "X-Requested-With"); 
     base.Response.AddHeader("Access-Control-Max-Age", "86400"); 
Questions connexes