Bonjour,
Je n'arrive pas à me sortir d'un soucis de retour AJAX en JSON.
Voilà mon problème :
J'ai développé plusieurs webmethod en .NET pour récupérer des données d'une base SQLServer. Toutes ces webmethod fonctionnent correctement et le retour en JSON est correct.
J' ai par exemple la webmethod suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[WebMethod]
        public void GetDiagnostiqueurs()
        {
            string cs = ConfigurationManager.ConnectionStrings["EES.PortailParticipatif.BMO.Properties.Settings.ConnectionString"].ConnectionString;
            List<Diagnostiqueur> diagnostiqueurs = new List<Diagnostiqueur>();
            using (SqlConnection con = new SqlConnection(cs))
            {
                SqlCommand cmd = new SqlCommand("GetDiagnostiqueursTinergie", con);
                cmd.CommandType = CommandType.StoredProcedure;
                con.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    Diagnostiqueur d = new Diagnostiqueur();
                    d.u_id = Convert.ToInt32(rdr["u_id"]);
                    d.u_societe = rdr["u_societe"].ToString();
                    d.u_nom = rdr["u_nom"].ToString() + " " + rdr["u_prenom"].ToString();
                    d.u_email = rdr["u_email"].ToString();
                    d.u_adresse = rdr["u_adresse"].ToString() + " " + rdr["u_adresse2"].ToString();
                    d.u_ville = rdr["u_ville"].ToString();
                    d.u_telephone = rdr["u_telephone"].ToString();
                    d.u_dateCreation = rdr["u_dateCreation"].ToString();
                    d.FinAbonnement = rdr["FinAbonnement"].ToString();
                    d.u_dateDerniereConnexion = rdr["u_DerniereConnexion"].ToString();
                    d.u_DureeAbonnement = rdr["u_DureeAbonnement"].ToString();
                    d.u_actif = rdr["u_actif"].ToString();
                    d.DiagnosticsRealises = rdr["DiagnosticsRealises"].ToString();
                    d.action = "";
                    diagnostiqueurs.Add(d);
                }
                con.Close();
            }
            JavaScriptSerializer js = new JavaScriptSerializer();
            Context.Response.Write(js.Serialize(diagnostiqueurs));
 
        }
et en Ajax :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
$(document).ready(function() {
            $.ajax({
                url: '/WebServices/Diagnostiqueurs.asmx/GetDiagnostiqueurs',
                method: 'post',
                dataType: 'json',
                success: function (data) {
                    alert("succes");
                },
                error: function (req) {
                    alert("erreur : " + req.responseText);
                }
            });
        });
...et ça fonctionne correctement.

Par contre, j'ai une webmethod avec un passage de paramètre. au niveau .NET, le retour semble correct.
Le code .NET :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[WebMethod(EnableSession = true)]
        public void GetEntreprises(string travaux)
        {
            string cs = ConfigurationManager.ConnectionStrings["EES.PortailParticipatif.BMO.Properties.Settings.ConnectionString"].ConnectionString;
            List<Entreprise> entreprises = new List<Entreprise>();
            using (SqlConnection con = new SqlConnection(cs))
            {
                SqlCommand cmd;
                cmd = new SqlCommand("GetEntreprisesTravauxTinergie", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@idTravaux", SqlDbType.Int).Value = Convert.ToInt32(travaux);
                con.Open();
                cmd.ExecuteNonQuery();
                SqlDataReader rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    Entreprise e = new Entreprise();
                    e.u_id = Convert.ToInt32(rdr["u_id"]);
                    e.u_societe = rdr["u_societe"].ToString();
                    e.u_typeSociete = rdr["u_typeSociete"].ToString();
                    e.u_statutSociete = rdr["u_statutSociete"].ToString();
                    e.u_nom = rdr["u_nom"].ToString() + " " + rdr["u_prenom"].ToString();
                    e.u_email = rdr["u_email"].ToString();
                    e.u_adresse = rdr["u_adresse"].ToString() + " " + rdr["u_adresse2"].ToString();
                    e.u_ville = rdr["u_ville"].ToString();
                    e.u_telephone = rdr["u_telephone"].ToString();
                    e.u_dateCreation = rdr["u_dateCreation"].ToString();
                    e.u_dateActivation = rdr["u_dateActivation"].ToString();
                    e.FinAbonnement = rdr["FinAbonnement"].ToString();
                    e.u_dateDerniereConnexion = rdr["u_DerniereConnexion"].ToString();
                    e.u_DureeAbonnement = rdr["u_DureeAbonnement"].ToString();
                    e.u_actif = rdr["u_actif"].ToString();
                    e.action = "";
                    entreprises.Add(e);
                }
                con.Close();
            }
            JavaScriptSerializer js = new JavaScriptSerializer();
            Context.Response.Write(js.Serialize(entreprises));
 
        }
La réponse retournée à ce niveau semble correcte.
La voici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[{"u_id":565,"u_societe":"x","u_typeSociete":"pme","u_statutSociete":"SARL","u_nom":"untel","u_email":"untel@x.fr","u_adresse":"2 rue untel","u_ville":"paris","u_telephone":"00 00 00 00 00","u_dateCreation":"15/01/2014","FinAbonnement":"31/12/2017","u_DureeAbonnement":"12 mois","u_dateActivation":"01/01/2016","u_dateDerniereConnexion":"28/05/2017","u_actif":"Oui","action":""}]
Pour mon ajax, j'ai mis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        $(document).ready(function() {
            $.ajax({
                type:'POST',
                url: '/WebServices/Entreprises.asmx/GetEntreprises',
                contentType: "application/json; charset=utf-8",
                data: '{travaux: "2" }',
                dataType: 'json',
                success: function (data) {
                    alert("success");
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    alert(xhr.status + " : " + thrownError + " || " + xhr.responseText);
                }
            });
        });
L'ajax me retourne une erreur "200 : SyntaxError: Unexpected token { in JSON at position...".
En regardant la réponse xhr, je vois que celle-ci comprend bien ce que me retourne ma webmethod, mais ajoute {"d":null} à la fin.
J'ai donc ceci en réponse xhr :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[{"u_id":565,"u_societe":"x","u_typeSociete":"pme","u_statutSociete":"SARL","u_nom":"untel","u_email":"untel@x.fr","u_adresse":"2 rue untel","u_ville":"paris","u_telephone":"00 00 00 00 00","u_dateCreation":"15/01/2014","FinAbonnement":"31/12/2017","u_DureeAbonnement":"12 mois","u_dateActivation":"01/01/2016","u_dateDerniereConnexion":"28/05/2017","u_actif":"Oui","action":""}]{"d":null}
En gras ce qui me pose problème.
Pouvez-vous m'aider à comprendre pourquoi j'ai cette {} en plus en fin de réponse ?
Merci d'avance