IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

WS .Net4 Json consommé par JQuery en cross domain


Sujet :

Services Web

  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut WS .Net4 Json consommé par JQuery en cross domain
    Bonjour à tous !

    Je souhaite exposer un WebService JSon développé en C#.net4 (.asmx) et le consommer via une page web d'un autre domaine en JQuery (cross domain).
    Plusieurs petits probleme se posent, et au final je ne sais pas exactement comment résoudre les erreurs...

    Pour commencer voici le WebService :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)]
    public String GetJSon()
    {
        return new JavaScriptSerializer().Serialize(GetMyObjects());
    }
    Par ailleurs, dans le web.config j'ai ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <webServices>
        <protocols>
            <add name="HttpGet"/>
        </protocols>
    </webServices>

    Le WS fonctionne bien lorsque je l'appel en local avec ce code Jquery (TEST1) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        $.ajax({
            //crossDomain: true,
            type: "POST",
            url: "URL_OF_WS/API.asmx/GetJSon",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                DoSomeThing(data.d);
            },
    	error: function (msg) {
    	    alert(msg.statusText);
    	}
        });
    Le WS renvoi cette chaine : [{"Param1":1,"Param2":"MonParam2"}]
    Parfait, mais lorsque je test en domain distant (cross domain), j'ai mon alerte qui m'affiche simplement "Erreur" sans plus d'informations.
    Que je mette crossDomain à true ou false, j'ai la meme problematique.
    Aurais-je un moyen de connaitre exactement l'erreur levé lorsque je suis en cross domain, ou plus simplement, est-ce que je fais quelque chose de mal ? ^^


    Pour creser un peu, retour en local cette fois-ci, j'essai ce bout de code, mais une erreur est remonté (TEST2) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $.getJSON('URL_OF_WS/API.asmx/GetJSon',
        function (data) {
            alert(data.d);
        }).error(function () { alert("error getJSON"); });

    Et là, les info retournées par le WS sont :
    <?xml version="1.0" encoding="utf-8"?>
    <string xmlns="http://www.alapub.com/">[{"Param1":1,"Param2":"MonParam2"}]</string>


    Donc peut etre que mon premier appel (TEST1) en cross domain leve une erreur à cause du parsing impossible ?

    Toujours pour aller plus loin, j'ai essayé de parser moi meme la chaine retournée lorsqu'il y a une erreur, avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    jQuery(document).ajaxError(function (event, request, settings) {
        var var1 = request.responseText.substring(79);
        var var2 = var1.lastIndexOf("</string>");
        var var3 = var1.substring(0, var2);
        alert(var3);
    });
    J'ai enfin ma chaine attendu : [{"Param1":1,"Param2":"MonParam2"}] !!
    Je test donc en disant (cross domain), mais je me retrouve encore avec un probleme puisque request.responseText n'existe pas.
    Je me retrouve donc à mon point de départ.

    J'espere avoir été clair dans l'explication de ma démarche, si vous avez des pistes, des liens ou des explications, elles sont les bienvenues

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    J'ai eu un problème un peu similaire, en appelant un service WCF avec JQuery. C'est pas vraiment du cross-domain (c'est un gadget Windows, donc un fichier HTML sur disque), mais la solution qui a marché pour moi marchera peut-être aussi pour toi... En gros, il suffit d'ajouter ça au tout début :

    (moi je l'ai mis avant même le $(document).ready)

    Par contre je sais pas trop quelles sont les implications au niveau de la sécurité...

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut
    Citation Envoyé par tomlev Voir le message
    (moi je l'ai mis avant même le $(document).ready)
    Merci Tomlev. Je viens de tester vite fais, ca n'a pas l'air de changer grand chose, mais je vais essayer de plus creuser tout à l'heure et reviendrai si ca fonctionne mieux, mais je suis pécimiste !

  4. #4
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Salut,

    Cross domain signifie que "URL_OF_WS" pointe sur un serveur différent de celui de la page web. On est d'accord?

    Tu peux nous montrer l’implémentation de JavaScriptSerializer().Serialize()?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Salut,
    Cross domain signifie que "URL_OF_WS" pointe sur un serveur différent de celui de la page web. On est d'accord?
    Hello !
    Oui, on est d'accord

    Citation Envoyé par Immobilis Voir le message
    Tu peux nous montrer l’implémentation de JavaScriptSerializer().Serialize()?
    Mhum, je ne suis pas sur de comprendre.
    Est ce le premier bout de code du premier message dont tu parles ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new JavaScriptSerializer().Serialize(GetMyObjects());
    Tu as une idée derrière la tete que tu penses à ca ? Je suis tout ouie

  6. #6
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par Firedeal Voir le message
    Hello !
    Oui, on est d'accord
    Alors je comprend mal le lien entre "domain distant" et "cross domain"
    Citation Envoyé par Firedeal Voir le message
    mais lorsque je test en domain distant (cross domain)
    Citation Envoyé par Firedeal Voir le message
    Est ce le premier bout de code du premier message dont tu parles ?
    Oui.
    Citation Envoyé par Firedeal Voir le message
    Tu as une idée derrière la tete que tu penses à ca ? Je suis tout ouie
    Je constate que selon la façon dont tu appelles ton service la chaîne de caractère n'est pas la même. Alors soit les attributs n'ont aucun impact, soit l'appel est mal paramétré soit j'aimerai bien savoir comment tu sérialises.

    EDIT: vu que la reponse est JSON, tu peux essayer de retirer "XmlSerializeString = false"

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  7. #7
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut Tjs pareil :'(
    Citation Envoyé par Immobilis Voir le message
    Alors je comprend mal le lien entre "domain distant" et "cross domain"
    C'est parcequ'il n'y en a pas, j'ai fais un abu dans language. Je parle bien cross domain
    Citation Envoyé par Immobilis Voir le message
    Je constate que selon la façon dont tu appelles ton service la chaîne de caractère n'est pas la même. Alors soit les attributs n'ont aucun impact, soit l'appel est mal paramétré soit j'aimerai bien savoir comment tu sérialises.
    Oui, en gros c'est le probleme... :s
    Mais je ne comprends toujours pas ce que je peux te montrer de plus pour la serialisation :
    GetMyObjects() retourne une liste d'une class très simple et je le passe dans JavaScriptSerializer().Serialize() qui me retourne une String, je ne fais rien de plus.
    En fait dans mes deux appel JQuery, je pense qu'il y en a un qui fait un get et l'autre un post. Ca pourrait expliquer la différence de réponse non ? Peut etre que ce sujet serait mieux dans la section JQuery ?
    Citation Envoyé par Immobilis Voir le message
    EDIT: vu que la reponse est JSON, tu peux essayer de retirer "XmlSerializeString = false"
    Au début de mes tests il n'y était pas, donc je l'ai ajouté. Mais l'un comme l'autre, rien ne change.


    Par ailleurs je remarque que pour mon [TEST2] (getJSON()), lorsque j'ajoute à la fin de l'url "?jsoncallback=?" je n'ai pas la même erreur.. Mais au final ca ne change pas grand chose...

  8. #8
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Argh, autant pour moi. Je croyais que "JavaScriptSerializer.Serialize" était une de tes méthodes
    Quand tu mets un point d'arrêt dessus la chaîne est-elle toujours correctement formée?
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Ok, j'ai testé chez moi et cela n'a rien à voir....
    La réponse est systématiquement mise dans un élément xml. Apparement cela est dû au type de retour (string). Pour contrer ce comportement, deux solutions:
    1. Prendre le contenu de l'élément avec InnerHTML: http://stackoverflow.com/questions/2...es-with-jquery;
    2. Ecraser la réponse du context ainsi (un des derniers commentaires de: http://stackoverflow.com/questions/2...mx-web-service):
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      [WebMethod]
      public void HelloWorld()
      {
          var ser = new JavaScriptSerializer();
          Context.Response.Write(ser.Serialize(new MyStruct() { Hello = "hello", World = new List<string>() { "aa", "bb", "cc" } }));
      }
      {"Hello":"hello","World":["aa","bb","cc"]}

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  10. #10
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut
    Merci Immobilis !

    La premiere solution m'aurai plus, mais d'apres ce que j'en déduis, cela fonctionne qu'avec ASP.NET AJAX, et je doute que le coss domain fonctionne ainsi. Je n'ai pas essayé, donc je creuserai par là un peu plus tard.

    La seconde solution est simple à mettre en place, et fonctionne... mais seulement en local :d
    En cross domain je me retrouve avec les même erreurs.

    Je me posait justement une question, avec $.ajax(), je me retrouve (suivants les tests), avec une erreur du type "parseerror". La fonction recoit donc bien quelque chose (d'ailleurs le status est 200 soit 'ok'). Comment récupérer le text retourné et le parser moi meme ?
    Les différentes méthodes pour récupérer les erreurs (ajaxError, ajaxSetup) ne me donne pas le 'resultat brute'.

    Mais je vais peut etre aller poster cette question Jquery dans une autre section du forum ^^

  11. #11
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Est-ce que tu utilises fiddler pour voir ce qui passe exactement?
    "Winter is coming" (ma nouvelle page d'accueil)

  12. #12
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 22
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Est-ce que tu utilises fiddler pour voir ce qui passe exactement?
    Ca alors !? Je revenai justement pour décrire ce que je venai de voir avec FireBug

    Donc Firebug récupere bien mon Json (qui est correctement syntaxé d'ailleurs), et lui arrive à le parser et à m'afficher mes objets
    Je ne suis pas loin je pense, mais je n'en reste pas moins bloqué :s

  13. #13
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par Firedeal Voir le message
    Donc Firebug récupere bien mon Json (qui est correctement syntaxé d'ailleurs), et lui arrive à le parser et à m'afficher mes objets
    Ah, je me disais aussi...
    Citation Envoyé par Firedeal Voir le message
    La premiere solution m'aurai plus, mais d'apres ce que j'en déduis, cela fonctionne qu'avec ASP.NET AJAX, et je doute que le coss domain fonctionne ainsi.
    InnerHTML n'est pas particulier à ASP.Net AJAX.
    "Winter is coming" (ma nouvelle page d'accueil)

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 20
    Par défaut cross domain policy
    Je crois que tu dois pouvoir résoudre ton problème grâce à jsonp.
    Voici un bon tuto pour ça.


    Si tu utilise wcf plutôt qu'un simple asmx, tu peux aussi configurer ton service pour éviter le cross domain policy : voir ici.

Discussions similaires

  1. jquery load() cross domain
    Par ratafia77 dans le forum jQuery
    Réponses: 8
    Dernier message: 27/03/2012, 17h15
  2. comment binder un json envoyer par la méthode Post (jquery)
    Par thor76160 dans le forum ASP.NET MVC
    Réponses: 9
    Dernier message: 04/01/2012, 15h54
  3. [AJAX] JQuery et cross domain
    Par GuyVerville dans le forum AJAX
    Réponses: 0
    Dernier message: 19/01/2010, 16h31
  4. WebService Win32 consommé par D2005
    Par SubZero2 dans le forum Delphi .NET
    Réponses: 7
    Dernier message: 05/12/2005, 11h50
  5. Analyseur de mémoire consommé par un soft
    Par chris_wafer_2001 dans le forum C++
    Réponses: 18
    Dernier message: 25/10/2005, 23h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo