web-dev-qa-db-fra.com

Comment laisser un fichier ASMX sortir JSON

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

Cependant, j'en ai besoin pour produire 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" };
    }
}
62
doekman

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

Assurez-vous que la demande est une POST requête, pas une GET. Scott Guthrie a un message expliquant pourquoi .

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

39
Pavel Chuchuva

Pour recevoir une chaîne JSON pure, sans qu'elle soit encapsulée dans un XML, vous devez écrire la chaîne JSON directement dans HttpResponse et changer 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}");
        }
    }
53
iCorrect

C'est probablement une vieille nouvelle, mais la magie semble être:

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

Avec ces pièces en place, une demande GET est réussie.

Pour un POST HTTP

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

et du côté client (en supposant que votre méthode Web s'appelle MethodName et qu'elle prend 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);
            }
        });
15
marc

Un petit accroc que j'ai appris à la dure (passer essentiellement 4 heures sur Google), vous pouvez utiliser PageMethods dans votre fichier ASPX pour renvoyer JSON (avec le marqueur [ScriptMethod ()]) pour une méthode statique, cependant si vous décidez de déplacer vos méthodes statiques dans un fichier asmx, il ne peut pas s'agir d'une méthode statique.

En outre, vous devez indiquer au service Web Content-Type: application/json afin de récupérer JSON de l'appel (j'utilise jQuery et le erreurs à éviter lors de l'utilisation de jQuery l'article était très éclairant - son du même site Web mentionné dans une autre réponse ici).

9
Bryan Rehbein

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

Vous trouverez peut-être utile d'envoyer un en-tête de type de contenu au serveur, par exemple.

'application/json; charset = utf-8 '

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

4
bitsprint

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 trouvé que le contrôle complet de la gestion d'une demande et de la génération d'une réponse est supérieur à tout ce que propose .NET pour des services Web simples et RESTful.

3
Kevin