Question

J'ai créé un fichier ASMX avec un code derrière le fichier. Cela fonctionne bien, mais il produit du XML.

Cependant, j'en ai besoin pour générer du JSON. La configuration de ResponseFormat ne semble pas fonctionner. Mon code-behind est:

[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
    [WebMethod]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
    public string[] UserDetails()
    {
        return new string[] { "abc", "def" };
    }
}
Était-ce utile?

La solution

De WebService renvoie le code XML même lorsque ResponseFormat est défini sur JSON :

  

Assurez-vous que la requête est une requête POST et non une requête GET. Scott Guthrie a un post expliquant pourquoi .

     

Bien qu'il soit écrit spécifiquement pour jQuery, cela peut également vous être utile:
   Utilisation de jQuery pour utiliser les services Web JSON ASP.NET

Autres conseils

Pour recevoir une chaîne JSON pure, sans la placer dans un fichier XML, vous devez écrire la chaîne JSON directement dans le HttpResponse et modifier le type de retour WebMethod en void .

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService {
        [WebMethod]
        public void WebMethodName()
        {
            HttpContext.Current.Response.Write("{property: value}");
        }
    }

Ceci est probablement une vieille nouvelle à ce jour, mais la magie semble être:

  • attribut [ScriptService] de la classe de service Web
  • [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] sur la méthode
  • Type de contenu: application / json dans la demande

Une fois ces éléments en place, une demande GET aboutit.

Pour un POST HTTP

  • [ScriptMethod (UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] sur la méthode

et côté client (en supposant que votre méthode Web s'appelle MethodName et qu'elle ne nécessite qu'un seul paramètre appelé searchString):

        $.ajax({
            url: "MyWebService.asmx/MethodName",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({ searchString: q }),
            success: function (response) {                  
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ": " + jqXHR.responseText);
            }
        });

Un piège rapide que j’ai appris à la dure (en passant 4 heures sur Google), vous pouvez utiliser PageMethods dans votre fichier ASPX pour renvoyer JSON (avec le marqueur [ScriptMethod ()]) pour une méthode statique. décidez de déplacer vos méthodes statiques vers un fichier asmx, il ne peut s'agir d'une méthode statique.

De plus, vous devez indiquer au service Web Content-Type: application / json afin de récupérer le code JSON de l'appel (j'utilise jQuery et 3 erreurs à éviter lors de l'utilisation de jQuery Cet article était très instructif - ça vient de le même site Web mentionné dans une autre réponse ici).

Appelez-vous le service Web à partir d'un script client ou côté serveur?

Il peut être utile d’envoyer un en-tête de type de contenu au serveur, par exemple:

'application / json; jeu de caractères = utf-8 '

Côté client, j'utilise un prototype de bibliothèque côté client et il existe un paramètre contentType lors d'un appel Ajax où vous pouvez le spécifier. Je pense que jQuery a une méthode getJSON.

Alternative: utilisez un gestionnaire HTTP générique (.ashx) et utilisez votre bibliothèque JSON préférée pour sérialiser et désérialiser manuellement votre JSON.

J'ai constaté que le contrôle complet du traitement d'une demande et de la génération d'une réponse surpassait tout ce que propose .NET pour des services Web simples et RESTful.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top