web-dev-qa-db-fra.com

Comment obtenir une réponse JSON à partir d'un service Web asmx 3.5

J'ai la méthode suivante:

using System.Web.Services;
using System.Web.Script.Services;
using System.Web.Script.Serialization;
using Newtonsoft.Json;
using System.Collections;

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

// [System.Web.Script.Services.ScriptService]
public class Tripadvisor : System.Web.Services.WebService {

    public Tripadvisor () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }


    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string HotelAvailability(string api)
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        string json = js.Serialize(api);
        //JsonConvert.SerializeObject(api);
        return json ;
    }

Ici, j’ai défini l’attribut ResponseFormat: json est toujours renvoyé au format XML.

Je veux formater json en utilisant ce service asmx Des idées?

13
Mansinh

J'ai fait face au même problème et j'ai inclus le code ci-dessous pour que cela fonctionne.

[WebMethod]
[ScriptMethod(UseHttpGet=true ,ResponseFormat = ResponseFormat.Json)]
public void HelloWorld()
{
    Context.Response.Clear();
    Context.Response.ContentType = "application/json";
    Context.Response.Write("Hello World");
    //return "Hello World";
}

Mettre à jour:

Pour obtenir un format JSON pur, vous pouvez utiliser le sérialiseur javascript comme ci-dessous. 

public class WebService1 : System.Web.Services.WebService
{
    [WebMethod]
    [ScriptMethod(UseHttpGet=true ,ResponseFormat = ResponseFormat.Json)]
    public void HelloWorld()
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        Context.Response.Clear();
        Context.Response.ContentType = "application/json";           
        HelloWorldData data = new HelloWorldData();
        data.Message = "HelloWorld";
        Context.Response.Write(js.Serialize(data));


    }
}

public class HelloWorldData
{
   public String Message;
}

Cependant, cela fonctionne pour les types complexes, mais chaîne ne montre aucune différence.

44
Saranya

Juste un doute. Quand n'obtenez-vous pas une réponse JSON? Parce que lorsque vous appelez le service Web à partir du client (je suppose un navigateur Web, c’est-à-dire xhr), vous devez spécifier l’en-tête du type de contenu de la demande sous la forme "application/json; charset = yourcharset".

Je crois que la solution ci-dessus renvoie toujours JSON, quel que soit le type de contenu spécifié par le client. Le framework dotnet asmx le permet à l’aide de la méthode d’en-tête content-type, ce qui permet de classer ce qui précède dans un hack dès lorsqu’une solution simple est disponible.

Question similaire sur Renvoyer les données Json du service Web ASMX

Cela pourrait aussi aider -> http://forums.asp.net/p/1054378/2338982.aspx#2338982

P.S: Je suppose que vous utilisez la version 4 de Dotnet.

1
aravind

Chers futurs lecteurs, La réponse actuellement acceptée n’est pas la bonne solution. Elle vous oblige à utiliser la variable JavaScriptSerializer et vous perdez la possibilité de demander le format XML (ou même tout format de sérialisation susceptible de se présenter ultérieurement). manière "implique également moins de code!

Si vous décorez votre classe de service avec l'attribut [ScriptService] - que vous avez déjà -, ASP.NET 3.5+ devrait alors sérialiser automatiquement la réponse à JSON à condition que votre appel Ajax demande JSON. Les suggestions de sérialisation manuelle en JSON sont tout simplement erronées, sauf si vous souhaitez utiliser un autre sérialiseur tel que Newtonsoft.

Le fait que vous voyiez XML suggère l'une des solutions suivantes:

  • Vous ne demandez pas de code JSON dans votre appel Ajax - veuillez consulter l'exemple de code ci-dessous.
  • Selon une réponse, il est possible que certaines entrées de web.config soient manquantes ici (disclaimer: je n'ai pas la plupart d'entre elles dans une production Web.config; ne commencez à les jouer qu'à rien d'autre travaux)

Voici un exemple simple d'utilisation d'un service Web ASMX compatible JSON:

<%@ WebService Language="C#" Class="WebService" %>
using System;
using System.Collections.Generic;
using System.Web.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {
    [WebMethod]
    public MyClass Example()
    {
        return new MyClass();
    }

    public class MyClass
    {
        public string Message { get { return "Hi"; } }
        public int Number { get { return 123; } }
        public List<string> List { get { return new List<string> { "Item1", "Item2", "Item3" }; } }
    }
}

JavaScript pour le demander et traiter la réponse (nous allons simplement faire apparaître une alerte JS avec le message de MyClass.Message):

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test</title>
    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.6.4.js" type="text/javascript"></script>  
</head>
<body>
    <script type="text/javascript">
        $.ajax({
            type: "POST",
            url: "WebService.asmx/Example",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: "{ }",
            error: function (XMLHttpRequest, textStatus, errorThrown) { alert(langError + " " + textStatus); },
            success: function (msg) {
                alert(msg.d.Message);
            }
        });
    </script>
</body>
</html>

Requête Http:

POST http://Host.com/WebService.asmx/Example HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/json; charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: http://Host.com/Test.aspx
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Connection: Keep-Alive
Content-Length: 3
Host: Host.com

{ }

Réponse HTTP:

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 20 Feb 2018 08:36:12 GMT
Content-Length: 98

{"d":{"__type":"WebService+MyClass","Message":"Hi","Number":123,"List":["Item1","Item2","Item3"]}}

Résultat:

"Hi" est affiché dans un popup JS.

0
Stephen Kennedy