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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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)

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