Renvoyer JSON d’ASMX et le manipuler correctement en Javascript

Je me rends compte qu’il y a déjà des tonnes de questions similaires, mais je n’arrive pas à comprendre celle-ci.

J’ai un service Web (C #, .net 3.5). Le code essentiel que vous devez connaître est le suivant:

[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class WSMember : System.Web.Services.WebService { public WSMember () { } [WebMethod] [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public ssortingng GetMember(ssortingng IdMember) { //Ignore the parameter for now... I will be looking up a database with it... //For now just return a minimal object: Member m = new Member(); m.Surname = "Smith"; m.FirstName = "John"; return new JavaScriptSerializer().Serialize(m); } 

Aussi, dans web.config, j’ai fait l’ajout suivant (que je viens de voir sur un autre post … est-ce normal / sans danger?)

        

Puis dans Default.aspx, je les deux références clés …

   

jquery.json-2.2.min.js a été téléchargé de Google Code

Et voici le Javascript:

  $(document).ready(function() { $("#button1").click(function(event) { var myData = { IdMember: "2" }; var encoded = $.toJSON(myData); alert(encoded); $.ajax({ type: "POST", url: "WSMember.asmx/GetMember", data: encoded, contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { alert("worked" + msg.d); //$("#sidebar").append(msg); }, error: function(msg) { alert(msg.d); //$("#sidebar").append(msg); } }); }); });  

Lorsque je l’exécute, le JSON encodé apparaît dans la boîte de message comme prévu … c’est-à-dire avec des guillemets:

{“IdMember”: “2”}

Cependant, cela échoue toujours. Même pour le plus élémentaire Hello World sans transmission de données, la procédure échoue. Je continue à être “indéfini” pour les données du message.

Si je viens d’utiliser alert (msg), il affiche [object XMLHttpRequest]

Est-ce que quelqu’un sait où mes données sont perdues ??

Et une autre question … y at-il quelque chose de fondamentalement faux avec ce que je fais?

Merci beaucoup.

MODIFIER:

Merci pour la réponse, les gars. J’ai essayé ce qui suit alors …

UseHttpGet = true est maintenant remplacé par false. (Encore une fois – je l’ai vu quelque part alors j’ai essayé … mais je savais que ça ne pouvait pas être juste: – /)

Supposons que le service Web renvoie maintenant une chaîne. Je construis la chaîne comme suit (ça semble un peu fou … la sérialisation a exactement la même chose …)

  SsortingngBuilder sb = new SsortingngBuilder(); sb.Append("{"); sb.Append("\"Surname\":"); sb.Append("\""); sb.Append(m.Surname); sb.Append("\""); sb.Append(",\"FirstName\":"); sb.Append("\""); sb.Append(m.FirstName); sb.Append("\""); sb.Append("}"); return sb.ToSsortingng(); 

Ce code retourne quelque chose comme:

 {"Surname":"Smith","FirstName":"John"} 

J’ai toujours la même erreur …

J’ai aussi essayé quelque chose comme retourner l’object “Member”, donc le code devient:

 [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public Member GetMember(ssortingng IdMember) { Member m = new Member(); m.Surname = "Smith"; m.FirstName = "John"; return m; } 

Cela aussi jette la même erreur.

Désolé d’être pénible … J’ai lu ces deux liens et d’autres. Je ne vois pas pourquoi c’est différent.

Existe-t-il des parameters de configuration supplémentaires dont je devrais être conscient?

Merci beaucoup pour les réponses.

UPDATE: Le problème est résolu. Les principales erreurs dans le code ci-dessus sont les suivantes:

 [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 

devrait être

 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

De plus, sur le formulaire, lors de l’utilisation d’un bouton pour appeler le javascript, je définissais de manière incorrecte le type d’entrée …

  

quand il devrait dire:

  

Un grand merci à tous ceux qui ont aidé.

Il me semble que votre principal problème est que vous essayez d’utiliser manuellement JavaScriptSerializer().Serialize au lieu de renvoyer un object. La réponse du service Web sera codée en double JSON.

Tu as raison! Il y a beaucoup de questions serrées. Regardez ici Puis-je renvoyer JSON à partir d’un service Web .asmx si le ContentType n’est pas JSON? et jQuery Ajax ne peut pas parsingr le résultat du service Web JSON et vous (j’espère) trouverez la réponse.

MISE À JOUR : Désolé, mais vous avez une petite erreur quelque part que vous n’avez pas posté. Pour résoudre le problème, j’ai créé un petit projet avec une ancienne version de Visual Studio (VS2008) qui contient pratiquement votre code et qui fonctionne. Je l’ai placé sur http://www.ok-soft-gmbh.com/jQuery/WSMember.zip . Vous pouvez le télécharger, le comstackr et vérifier qu’il fonctionne. Ensuite, vous pouvez comparer votre code avec my et trouver votre erreur.

Meilleures salutations

Si vous publiez vos données, pourquoi définissez-vous UseHttpGet = true? Cela ne devrait-il pas être faux pour correspondre au type de réponse de votre demande? De plus, placer un point d’arrêt dans l’appel ws pour voir exactement ce que le sérialiseur renvoie aiderait également … Je ne pense pas qu’il devrait renvoyer un object JSON si la valeur de retour est une chaîne.

HTH.

Oui, certainement ne pas sérialiser manuellement l’object. Si vous renvoyez un type de Member , la structure gérera la sérialisation JSON pour vous.

Lorsque vous voyez l’alerte [object XMLHttpRequest], cela ressemble à entrer dans le gestionnaire d’erreurs de votre appel $ .ajax (), où la réponse passe dans son object XHR en tant que premier paramètre. Vous obtenez probablement une erreur 500 sur le serveur.

Voici un exemple de décodage de la réponse d’erreur ASP.NET AJAX dans jQuery . Le plus simplement, changez votre gestionnaire d’erreur en ceci:

 error: function(xhr, status, error) { var err = eval("(" + xhr.responseText + ")"); alert(err.Message); } 

Cela vous donnera un aperçu de l’erreur spécifique.

Si vous renvoyez un object complexe (objects relationnels avec des clés étrangères), vous avez 2 options:

  1. Utiliser un object DTO
  2. Écrivez votre propre convertisseur de sérialisation spécifique

j’ai un mauvais anglais, mais c’est une solution

—– WSMember.asmx ——

 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class WSMember : System.Web.Services.WebService { public WSMember () { } [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public ssortingng GetMember(int IdMember) { Member m = new Member();//Get Member from DB, exam Linq to Sql m.Surname = "Smith"; m.FirstName = "John"; return ssortingng.Format("{{ \"Surname\":\"{0}\",\"FirstName\":\"{1}\" }}",m.Surname,m.FirstName); } } 

—- Default.aspx —-

 Just a test