J'ai vu une question similaire, mais cela n'a pas résolu mon problème. J'ai un service Web JSON dans un fichier ASMX;
Le code de la méthode Web p> Ceci formate correctement la liste correctement mais enveloppe l'ensemble du retour dans XML. Voici la réponse: p> Vous pouvez afficher la réponse à votre auto en cliquant sur ce lien: p>
9 Réponses :
La Webmethod est capable de servir les mêmes informations que XML et JSON. Vous devez spécifier quel format vous souhaitez (DataType) dans le client, car vous soumettez votre demande.
En outre, vous n'êtes pas censé sérialiser l'objet à JSON manuellement, mais plutôt, retournez rôles em >, et ce sera sérialisé à JSON si votre client demande les données comme JSON. P> EDIT FORT> P> P> EXEMPLE JQUERY (Notez le paramètre DataType): Il convient de mentionner que l'objet ne sera pas retourné dans exactement le format que vous avez spécifié, mais plutôt enveloppé dans un objet: p> { d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] }
Est-ce qu'il y a de toute façon pour spécifier le type de données dans un message?
Je ne suis pas sûr de suivre ... L'exemple ci-dessus est un post.
Je suis désolé, je veux dire passer le paramètre dans l'URL comme l'URL que j'ai incluse dans ma question.
Ah, à droite. J'ai mis à jour mon exemple ci-dessus pour utiliser les URL et les paramètres que vous utilisez. Utilisation 'GET' au lieu de "POST", les données transmises dans "DATA" seront récupérées via QueryString plutôt que de former des valeurs.
Depuis $ .Ajax () ne fonctionnera pas pour une utilisation en croix, je dois utiliser $ .gejson () et mon service retourne JSONP. J'ai le même problème, le résultat JSON est enveloppé dans XML. Depuis que j'utilise $ .getjson (), je ne sais pas comment définir les en-têtes pour dire au service que je veux un résultat JSON, et non un résultat XML. Des idées comment faire cela, juste via l'URL? Y a-t-il des paramètres intégrés que les services .NET recherchent dans la chaîne de requête?
Assurez-vous que votre classe de service a un attribut [scriptservice]. Cet attribut n'est pas ajouté par défaut. P>
Essayez JayRock pour .NET, c'est un gestionnaire soigné pour .NET JSON RPC. Cela fera exactement ce dont vous avez besoin.
Il y a une étape à pied comment pour
Nous avons fait une autre page qui appelle le côté Service Server et écrit la réponse (dans notre cas un .aspx). Nous avons nettoyé tout le code HTML, le corps de la tête de DOCTYPE et avons rendu le code côté serveur pour appeler le service et la réponse.WRITE IT. P>
(dans le boîtier ASPX laissant simplement la directive de la page en haut) p>
De cette façon, vous pouvez obtenir une chaîne propre. p>
Au fait, si cela expose notre demande à des menaces de sécurité ou à des hits de performance majeurs, j'apprécierais vraiment les commentaires. Trop occupé pour le demander ici ou sur la recherche de dessus :) p>
J'ai fait la même erreur en manipulant la sérialisation moi-même. Vous ne vous êtes pas censé revenir à la chaîne, mais l'objet lui-même. P>
Si vous avez déjà développé une centaine de services comme celle-ci, un travail autour de vous: il suffit de créer un ASPX, Servicecaller.aspx, supprimez tout dans le HTML, laissez simplement la directive de la page et utilisez le codeBeHind pour appeler le service et la réponse. Écrivez la chaîne. Prenez également le nom de la méthode de service en tant que paramètre comme "HelloWorld" et utilisez la réflexion pour l'appeler. P>
C'est un peu montrant votre oreille gauche avec la main droite, mais cela fonctionne. Vous pouvez également intégrer facilement une gestion des rôles et utiliser la réflexion Obtenir le nom du service en tant que chaîne Vérifiez la base de données si l'utilisateur peut appeler ce service et avec une réflexion invoquée la méthode. p>
(Toute commentaires à ce sujet est la bienvenue :) p>
Votre mot-clé "statique" manqué dans la déclaration de méthode Veuillez examiner ce qui suit.
FYI: Toutes les méthodes Web doivent être statiques p>
[Webmethod] [ScriptMethod (ResponseFormat = ResponSformat.json)] P>
public static string GetUserRoles(string JSONUserCode) { string retRoles = string.Empty; List<JSONRole> roles = new List<JSONRole>(); {... I Populate the roles here ...} DataContractJsonSerializer serializer = new DataContractJsonSerializer(roles.GetType()); MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms, roles); string jsonString = Encoding.Default.GetString(ms.ToArray()); ms.Close(); return jsonString; }
s'avère que ce n'est pas un type de données qui compte mais il a fonctionné comme un charme. p> p>
au lieu de retourner une chaîne dans votre WebMethod Utilisation:
JavaScriptSerializer js = new JavaScriptSerializer(); Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));
Utiliser comme celui-ci ne pas renvoyer la chaîne de chaîne.Juste écrire