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

AJAX Discussion :

[AJAX] JS appel d'une fonction de webservice avec un paramètre


Sujet :

AJAX

  1. #1
    Futur Membre du Club  
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut [AJAX] JS appel d'une fonction de webservice avec un paramètre
    Bonjour,

    J'ai développé un Web service ASP .NET qui doit être utilisé obligatoirement depuis du javascript avec internet Explorer.
    Pour l'instant j'arrive à appeler les WebMethods de mon webservice qui ne demandent aucun paramètre.
    Cela fait un moment que je cherche et aucune des solutions que j'ai trouvé sur le net ne foncionne .
    Voici mon code côté WebService:

    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
     
    [WebMethod]
    public void Ajout()   //Celle ci fonctionne, pas de paramètres  :)  
    {
        ThreadStart ST = new ThreadStart(lesOperations.ThreadAjout);
        Thread T = new Thread(ST);
        T.Start();
    }
     
    [WebMethod]
    public void MAJStatutIncident(string refRally) //Celle ci ne fonctionne pas, lorsque je met un point d'arrêt je ne passe même pas par là. 
    {
        ParameterizedThreadStart ST = new ParameterizedThreadStart(lesOperations.ThreadMAJStatut);
        Thread T = new Thread(ST);
        T.Start(refRally);
    }


    Je pense qu'il n'y a pas de problème du côté de mon webservice car j'arrive à appeller cette fonction avec la page générée par visual studio lors du démarrage du webservice.

    Voici le code de mon Javascript. L'application qui appel mon Webservice a un événement OnSave() qui me permet de faire du JS lors d'une sauvegarde.
    mon code pour la fonction sans paramètre fonctionne :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var xhr_object = null;
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP" ); 
    xhr_object.open("POST", "http://localhost:1658/Service1.asmx/Ajout", false); 
    xhr_object.send(null); 
    if(xhr_object.readyState == 4) alert("Transfert vers rally en cours. Le transfert peut durer quelques secondes.(F5 pour rafraichir)" );
    if(xhr_object.readyState == 0) alert("Echec du transfert vers rally." );

    celui qui demande un paramètre ne fonctionne pas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var data = "refRally=" + crmForm.all.to_ref.DataValue;
    var xhr_object = null;
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP" ); 
    xhr_object.open("POST", "http://localhost:1658/Service1.asmx/MAJStatutIncident", true); 
    xhr_object.send(data); 
    if(xhr_object.readyState == 4) alert("Recupération du statut rally en cours (F5) pour rafraichir." );
    if(xhr_object.readyState == 0) alert("Echec lors de la récupération du statut." );


    J'ai pourtant l'impression que c'est bon, qu'est ce qui ne va pas ?

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Salut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var data = "refRally=" + crmForm.all.to_ref.DataValue;
    Sans le HTML associé, difficile de répondre, mais en imaginant que crmForm est le name d'un formulaire et to_ref un champ de formulaire, reste à déterminer à quoi correspond DataValue...
    A tout hasard, essaye avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var data = "refRally=" + document.forms['crmForm'].elements['to_ref'].value;
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Futur Membre du Club  
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    En fait je travail avec le CRM 3.0 de Microsoft et je n'ai pas accès au html. Le MSCRM met a disposition un événement Onload() qui me permet d'exécuter du JavaScript au chargement du formulaire. Je ne peux donc faire que du JavaScript en PHP ca avait l'air tellement plus simple .

    refRally est un string demandé par mon Web Service
    crmForm.all.to_ref est un champ de mon formulaire
    .DataValue me donne la valeur en string de mon champ (j'arrive bien à l'afficher quand je le mets dans mon alerte).

    Apparemment ma variable data est correcte, le problème doit venir de mon appel au Web Service car je ne rentre même pas dans ma WebMethod (WebMethode que j'arrive à appeler avec la page que Visual studio me génère).

  4. #4
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Salut,

    Es tu bien sûr que ton wsdl défini un accès via un POST standard, et pas simplement un GET et un appel POST SOAP ?

    ERE
    Quand une tête pense seule, elle devient folle.

  5. #5
    Futur Membre du Club  
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Je suis noob avec Ajax et je connais un peu les Webservice.
    Mais d'après ce que je vois je peux consommer ma méthode avec soap 1.1, soap 1.2 et POST HTTP

    Voici le transport de mon binding : http://schemas.xmlsoap.org/soap/http

    Voici mon WSDL ( j'espère que c'est pas imbuvable ) :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
      <?xml version="1.0" encoding="utf-8" ?> 
    - <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://WebServiceCRMRally/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://WebServiceCRMRally/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
    + <wsdl:types>
    - <s:schema elementFormDefault="qualified" targetNamespace="http://WebServiceCRMRally/">
    + <s:element name="HelloWorld">
    - <s:complexType>
    - <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="prenom" type="s:string" /> 
      </s:sequence>
      </s:complexType>
      </s:element>
    - <s:element name="HelloWorldResponse">
    - <s:complexType>
    - <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string" /> 
      </s:sequence>
      </s:complexType>
      </s:element>
    + <s:element name="Ajout">
      <s:complexType /> 
      </s:element>
    - <s:element name="AjoutResponse">
      <s:complexType /> 
      </s:element>
    - <s:element name="MAJ">
      <s:complexType /> 
      </s:element>
    - <s:element name="MAJResponse">
      <s:complexType /> 
      </s:element>
    - <s:element name="MAJStatutIncident">
    - <s:complexType>
    - <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="refRally" type="s:string" /> 
      </s:sequence>
      </s:complexType>
      </s:element>
    - <s:element name="MAJStatutIncidentResponse">
      <s:complexType /> 
      </s:element>
      </s:schema>
      </wsdl:types>
    - <wsdl:message name="HelloWorldSoapIn">
      <wsdl:part name="parameters" element="tns:HelloWorld" /> 
      </wsdl:message>
    - <wsdl:message name="HelloWorldSoapOut">
      <wsdl:part name="parameters" element="tns:HelloWorldResponse" /> 
      </wsdl:message>
    - <wsdl:message name="AjoutSoapIn">
      <wsdl:part name="parameters" element="tns:Ajout" /> 
      </wsdl:message>
    - <wsdl:message name="AjoutSoapOut">
      <wsdl:part name="parameters" element="tns:AjoutResponse" /> 
      </wsdl:message>
    - <wsdl:message name="MAJSoapIn">
      <wsdl:part name="parameters" element="tns:MAJ" /> 
      </wsdl:message>
    - <wsdl:message name="MAJSoapOut">
      <wsdl:part name="parameters" element="tns:MAJResponse" /> 
      </wsdl:message>
    - <wsdl:message name="MAJStatutIncidentSoapIn">
      <wsdl:part name="parameters" element="tns:MAJStatutIncident" /> 
      </wsdl:message>
    - <wsdl:message name="MAJStatutIncidentSoapOut">
      <wsdl:part name="parameters" element="tns:MAJStatutIncidentResponse" /> 
      </wsdl:message>
    - <wsdl:portType name="Service1Soap">
    - <wsdl:operation name="HelloWorld">
      <wsdl:input message="tns:HelloWorldSoapIn" /> 
      <wsdl:output message="tns:HelloWorldSoapOut" /> 
      </wsdl:operation>
    - <wsdl:operation name="Ajout">
      <wsdl:input message="tns:AjoutSoapIn" /> 
      <wsdl:output message="tns:AjoutSoapOut" /> 
      </wsdl:operation>
    - <wsdl:operation name="MAJ">
      <wsdl:input message="tns:MAJSoapIn" /> 
      <wsdl:output message="tns:MAJSoapOut" /> 
      </wsdl:operation>
    - <wsdl:operation name="MAJStatutIncident">
      <wsdl:input message="tns:MAJStatutIncidentSoapIn" /> 
      <wsdl:output message="tns:MAJStatutIncidentSoapOut" /> 
      </wsdl:operation>
      </wsdl:portType>
    - <wsdl:binding name="Service1Soap" type="tns:Service1Soap">
      <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    - <wsdl:operation name="HelloWorld">
      <soap:operation soapAction="http://WebServiceCRMRally/HelloWorld" style="document" /> 
    - <wsdl:input>
      <soap:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output>
      <soap:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
    - <wsdl:operation name="Ajout">
      <soap:operation soapAction="http://WebServiceCRMRally/Ajout" style="document" /> 
    - <wsdl:input>
      <soap:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output>
      <soap:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
    - <wsdl:operation name="MAJ">
      <soap:operation soapAction="http://WebServiceCRMRally/MAJ" style="document" /> 
    - <wsdl:input>
      <soap:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output>
      <soap:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
    - <wsdl:operation name="MAJStatutIncident">
      <soap:operation soapAction="http://WebServiceCRMRally/MAJStatutIncident" style="document" /> 
    - <wsdl:input>
      <soap:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output>
      <soap:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
      </wsdl:binding>
    - <wsdl:binding name="Service1Soap12" type="tns:Service1Soap">
      <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    - <wsdl:operation name="HelloWorld">
      <soap12:operation soapAction="http://WebServiceCRMRally/HelloWorld" style="document" /> 
    - <wsdl:input>
      <soap12:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output>
      <soap12:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
    - <wsdl:operation name="Ajout">
      <soap12:operation soapAction="http://WebServiceCRMRally/Ajout" style="document" /> 
    - <wsdl:input>
      <soap12:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output>
      <soap12:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
    + <wsdl:operation name="MAJ">
      <soap12:operation soapAction="http://WebServiceCRMRally/MAJ" style="document" /> 
    - <wsdl:input>
      <soap12:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output>
      <soap12:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
    - <wsdl:operation name="MAJStatutIncident">
      <soap12:operation soapAction="http://WebServiceCRMRally/MAJStatutIncident" style="document" /> 
    - <wsdl:input>
      <soap12:body use="literal" /> 
      </wsdl:input>
    - <wsdl:output>
      <soap12:body use="literal" /> 
      </wsdl:output>
      </wsdl:operation>
      </wsdl:binding>
    + <wsdl:service name="Service1">
    - <wsdl:port name="Service1Soap" binding="tns:Service1Soap">
      <soap:address location="http://localhost:1658/Service1.asmx" /> 
      </wsdl:port>
    - <wsdl:port name="Service1Soap12" binding="tns:Service1Soap12">
      <soap12:address location="http://localhost:1658/Service1.asmx" /> 
      </wsdl:port>
      </wsdl:service>
      </wsdl:definitions>
    La seule chose dont je suis sûr c'est que Visual studio (la page qu'il génère pour tester mon web service) utilise le protocole HTTP POST pour utiliser ma méthode et ca fonctionne :


  6. #6
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    C'est ce que je te disais: il y a bien un POST mais c'est une enveloppe SOAP qui est envoyée. En bref, l'aspect data que tu dois donc envoyer est la structure XML <soap:Envelope ... > </soap:Envelope> et pas le simple couple champ/valeur

    ERE
    Quand une tête pense seule, elle devient folle.

  7. #7
    Futur Membre du Club  
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Ok donc je traduit mon enveloppe soap xml en Javascript et ca devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <MAJStatutIncident xmlns="http://WebServiceCRMRally/">
          <refRally>string</refRally>
        </MAJStatutIncident>
      </soap:Body>
    </soap:Envelope>

  8. #8
    Expert confirmé
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Points : 4 045
    Points
    4 045
    Par défaut
    Re,
    Oui, je pense que si tu l'envoies sous forme de datas cela devrait le faire. Il va te falloir certainement ajuster l'élément SOAPAction qui apparait dans le header.

    ERE
    Quand une tête pense seule, elle devient folle.

  9. #9
    Futur Membre du Club  
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Ca a pas l'air de mieux fonctionner, je ne passe toujours pas dans ma webMethod .

    Ma SOAPAction est pourtant dans le open.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var xhr_object = null;
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP" ); 
    xhr_object.open("POST", "http://localhost:1658/Service1.asmx/MAJStatutIncident", true); 
    xhr_object.send('<?xml version="1.0" encoding="utf-8"?>'+
    	'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+
    		'<soap:Body>'+
    			'<MAJStatutIncident xmlns="http://WebServiceCRMRally/">'+
    				'<refRally>'+crmForm.all.to_ref.DataValue+'</refRally>'+
    			'</MAJStatutIncident>'+
    		'</soap:Body>'+
    	'</soap:Envelope>'); 
    if(xhr_object.readyState == 4) alert("Recupération du statut rally en cours (F5) pour rafraichir." );
    if(xhr_object.readyState == 0) alert("Echec lors de la récupération du statut." );

  10. #10
    Futur Membre du Club  
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Bon j'ai réussi. Enfin de compte j'étais pas loin depuis le début ^^.
    Il me manquait un header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var xhr_object = null;
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP" ); 
    xhr_object.open("POST", "http://localhost:1658/Service1.asmx/MAJStatutIncident", true); 
    xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); //Le header qu'il me manquait.
    xhr_object.send('refRally='+crmForm.all.to_ref.DataValue); 
    if(xhr_object.readyState == 4) alert("Recupération du statut rally en cours (F5) pour rafraichir." );
    if(xhr_object.readyState == 0) alert("Echec lors de la récupération du statut." );

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/11/2015, 21h04
  2. Appel d'une fonction de WebService
    Par chris_wafer dans le forum Débuter
    Réponses: 2
    Dernier message: 30/09/2014, 23h13
  3. appel d'une fonction/sub passé(e) en paramètre
    Par avigeilpro dans le forum VB.NET
    Réponses: 5
    Dernier message: 09/04/2012, 19h38
  4. [AJAX] Appel d'une fonction dans une autre
    Par leod38 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 26/05/2008, 14h46
  5. [AJAX] Appel d'une fonction javascript dans une page chargée en ajax
    Par baedal dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 17/04/2008, 17h03

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