Vous ne pouvez pas envoyer automatiquement des données XML structurées à un service Web dans InfoPath 2003

Traductions disponibles Traductions disponibles
Numéro d'article: 826989 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsque vous envoyez des informations à partir d'un formulaire InfoPath vers un service Web à l?aide de la fonctionnalité d?envoi intégrée InfoPath, vous pouvez rencontrer un des problèmes suivants :
  • Vous pouvez recevoir un message d'erreur. Il varie en fonction des informations qui sont envoyées et du codage de la méthode qui est invoquée sur le service Web.
  • Vous pouvez remarquer que des données inattendues sont envoyées au service Web.
Cet article décrit également :
  • La façon dont InfoPath envoie des données à un service Web.
  • Deux méthodes pour envoyer le contenu d'un formulaire InfoPath à un service Web.

Cause

Lorsqu?InfoPath envoie des données à un service Web, il envoie le contenu du n?ud XML qui a été sélectionné comme paramètre, mais pas le n?ud XML lui-même. Cela fonctionne généralement bien. Par exemple, vous disposez d?une méthode de service Web telle que la suivante :
[WebMethod]
   public void SendSampleString( string sampleString )
   {
      //Do something interesting with the sample string.
   } 
Si vous envoyez l'élément XML suivant à cette méthode de service Web, le paramètre sampleString contient "Hello, World!" (comme vous pouvez vous y attendre).
<sampleElement>"Hello, World!"</sampleElement>
Malheureusement, ce comportement peut rendre difficile l?envoi de n?uds XML ou le formulaire InfoPath complet à un service Web. Par exemple, vous disposez d?une méthode de service Web telle que la suivante :
[WebMethod]
   public string SendXMLElement( System.Xml.XmlElement theElement )
   {
      //Report how many children the submitted node had.
      return "Node with " + theElement.ChildNodes.Count + " children submitted.";
   }
Si vous envoyez l'exemple d?élément XML à cette méthode à l?aide de la fonctionnalité d?envoi intégrée InfoPath, le contenu du paramètre theElement génère une erreur. Cette erreur se produit car seul le contenu de l'élément XML ("Hello, World!") est envoyé à la méthode du service Web. Comme la chaîne n'est pas un élément XML valide, .NET Framework génère une erreur; le message d'erreur s?affiche dans InfoPath.

Un problème semblable se produit si vous essayez d?envoyer le formulaire InfoPath complet à la méthode exemple du service Web. Dans ce cas, InfoPath envoie tous les n?uds enfants du formulaire InfoPath, mais pas le n?ud racine. Ainsi, plusieurs n?uds XML de niveau supérieur sont envoyés. Comme ce n'est pas du format XML valide, .NET Framework sélectionne le premier n?ud XML de niveau supérieur et l?utilise comme le paramètre theElement. Tous les autres n?uds sont ignorés comme s?ils n?avaient pas été envoyés.

Résolution

Ce problème est résolu dans Microsoft Office 2003 Service Pack 1. Vous devez donc vous procurer le Service Pack le plus récent pour Microsoft Office 2003.

Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
870924 Comment faire pour obtenir le dernier Service Pack d'Office 2003

Contournement

Pour contourner ce problème, écrivez une action d?envoi personnalisée dans le script. Vous pouvez appliquer l'une des méthodes suivantes :
  • Utilisez une source de données secondaire pour effectuer l'opération d?envoi.
  • Écrivez du code qui crée un message SOAP personnalisé et qui l'envoie au service Web.

Utilisation d?une source de données secondaire

  1. Dans le menu Outils, cliquez sur Sources de données secondaires.
  2. Dans la boîte de dialogue Sources de données secondaires, cliquez sur Ajouter.
  3. Sur la première page de l'Assistant Configuration de la source de données, cliquez sur Service Web puis sur Suivant.
  4. Entrez l'emplacement du service Web que vous souhaitez envoyer, puis cliquez sur Suivant.
  5. Sélectionnez la méthode du service Web que vous voulez utiliser, puis cliquez sur Suivant.
  6. Lorsqu?InfoPath vous invite à sélectionner le champ ou le groupe à partir du formulaire qui sera utilisé pour remplir les paramètres de la méthode du service Web, laissez les paramètres vides, puis cliquez sur Suivant.
  7. Désactiver la case à cocher « Se connecter à cette source de données secondaire à l'ouverture du formulaire », cliquez sur Terminer, puis sur OK pour fermer la boîte de dialogue Sources de données secondaires.
  8. Dans le menu Outils, cliquez sur Envoi de formulaires.
  9. Dans la boîte de dialogue Envoi de formulaires, cliquez sur Autoriser l'envoi.
  10. Dans la liste Envoyer, cliquez sur Envoyer au moyen d'un script personnalisé, puis cliquez sur OK pour ouvrir Microsoft Script Editor.
  11. Dans la méthode XDocument::OnSubmitRequest, utilisez le script tel que le suivant pour envoyer le formulaire complet.

    Remarque Vous pouvez également envoyer des éléments individuels dans le formulaire.
    try{
          //Get a reference to the SendXMLElement secondary data source.
          var objSendXMLElement = XDocument.GetDOM("SendXMLElement");
          objSendXMLElement.setProperty( "SelectionNamespaces",
             'xmlns:s1="http://joelallxp.microsoft.com/schema" ' +
             'xmlns:s0="http://tempuri.org/" ' +
             'xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution"' );
     
          //Remove any data from the SendXMLElement secondary data source.
          var objData = objSendXMLElement.selectSingleNode(
             "/dfs:myFields/dfs:queryFields/s0:SendXMLElement/s0:theElement");
          var objCurrentData = objData.selectNodes("@* | node()");
          objCurrentData.removeAll();
     
          //Clone the XDocument.
          var objClonedDocument = XDocument.DOM.documentElement.cloneNode(true );
          objData.appendChild( objClonedDocument );
       
          //Call the "Query" method of the secondary data source to send the data.
          XDocument.DataObjects("SendXMLElement").Query();
       
          //Report the results of the submit.
          XDocument.UI.Alert( 
             objSendXMLElement.selectSingleNode(
                "/dfs:myFields/dfs:dataFields/s0:SendXMLElementResponse/s0:SendXMLElementResult").text );
          eventObj.ReturnStatus = true;
       }
       catch(ex)
       {
          eventObj.ReturnStatus = false;
       }

Écriture de code

  1. Dans le menu Outils, cliquez sur Envoi de formulaires.
  2. Dans la boîte de dialogue Envoi de formulaires, cliquez sur Autoriser l'envoi.
  3. Dans la liste Envoyer, cliquez sur Envoyer au moyen d'un script personnalisé, puis cliquez sur OK pour ouvrir Microsoft Script Editor.
  4. Dans la méthode XDocument::OnSubmitRequest, utilisez le script tel que le suivant pour envoyer le formulaire complet.

    Remarque Vous pouvez également envoyer des éléments individuels dans le formulaire.
    try
       { 
          //Create a SOAP object.
          var objSOAPConnector = new ActiveXObject("MSOSOAP.HttpConnector30");
       
          //Set the EndPointURL property to point to the Web service.
          objSOAPConnector.Property("EndPointURL") = "http://server/WebService1/Submit.asmx";
     
          //Set the SoapAction property to point to the Web service method. You can find this URI 
          //in the WSDL file of the Web service.
          objSOAPConnector.Property("SoapAction") = "http://tempuri.org/SendXMLElement";
          objSOAPConnector.Connect();
          
          //Begin construction of a SOAP message to send to the Web service.
          objSOAPConnector.BeginMessage();
     
          var objSOAPSerializer = new ActiveXObject("MSOSoap.SoapSerializer30");
          objSOAPSerializer.Init( objSOAPConnector.InputStream );
          objSOAPSerializer.startEnvelope();
          objSOAPSerializer.startBody();
     
          //Construct the structure that marks the method name and the parameter name 
          //that you are sending.
          objSOAPSerializer.StartElement( "SendXMLElement", "http://tempuri.org/" );
          objSOAPSerializer.StartElement( "theNode", "http://tempuri.org/" );
     
          //Write out the XML of the document.
          objSOAPSerializer.WriteXml( XDocument.DOM.documentElement.xml );
     
          //Finish each element.
          objSOAPSerializer.EndElement();
          objSOAPSerializer.EndElement();
     
          //Call EndMessage to complete the SOAP message and send it to the Web service method.
          //This results in the Web service method being called.
          objSOAPSerializer.endBody();
          objSOAPSerializer.endEnvelope(); 
          objSOAPConnector.EndMessage();
     
          //Use a SoapReader to read the response from the Web service method .
          var ResponseReader = new ActiveXObject("MSOSOAP.SoapReader30");
          ResponseReader.Load( objSOAPConnector.OutputStream );
     
          //If there was no error, return true.
          if (ResponseReader.Fault != null)
          {
             eventObj.ReturnStatus = false;
             throw "Error submitting data: " + ResponseReader.Fault.xml;
          }
          eventObj.ReturnStatus = true;
       } 
       catch (ex)
       { 
          XDocument.UI.Alert("Failed to submit document: " + ex.description); 
       }

Statut

Ce comportement est voulu par la conception même du produit.

Ce comportement est voulu par la conception même de Microsoft Office InfoPath 2003. Il est modifié par Microsoft Office InfoPath 2003 Service Pack 1.

Plus d'informations

Procédure pour reproduire le problème

  1. Créez un service Web qui contient les deux méthodes suivantes :
    • Méthode 1
      [WebMethod]
         public void SendSampleString( string sampleString )
         {
            //Do something interesting with the sample string.
         } 
    • Méthode 2
      [WebMethod]
         public string SendXMLElement( System.Xml.XmlElement theElement )
         {
            //Report how many children the submitted node had.
            return "Node with " + theElement.ChildNodes.Count + " children submitted.";
         }
  2. Créez un nouveau formulaire InfoPath en sélectionnant Nouveau à partir d'une source de données.
  3. Dans l'Assistant Configuration de la source de données, sélectionnez Service Web, puis cliquez sur Suivant.
  4. Cliquez sur Réception et envoi des données, puis sur Suivant.
  5. Pour la méthode du service Web réception des données, procédez comme suit :
    1. Entrez l'URL dans le service Web que vous avez créé, puis cliquez sur Suivant.
    2. Dans la liste Sélectionnez une opération, cliquez sur SendXMLElement, puis sur Suivant.
  6. Pour la méthode du service Web envoi des données, procédez comme suit :
    1. Entrez l'URL dans le service Web que vous avez créé, puis cliquez sur Suivant.
    2. Dans la liste Sélectionnez une opération, cliquez sur SendXMLElement, puis sur Suivant.
  7. Cliquez sur le bouton Définir pour sélectionner un paramètre pour l'opération d?envoi.
  8. Dans la liste dataFields, cliquez sur SendXMLElementResult, sur OK, puis sur Suivant.
  9. Sélectionnez Créer d'abord la vue des données, puis cliquez sur Terminer pour fermer la boîte de dialogue Assistant Configuration de la source de données.
  10. Ajoutez le champ SendXMLElementResult au formulaire.
  11. Affichez l?aperçu du formulaire.
  12. Dans le contrôle Envoi du résultat du n?ud XML, tapez Hello, World!
  13. Dans le menu Fichier, cliquez sur Envoyer.

    Le message d?erreur suivant s?affiche :
    InfoPath ne peut pas envoyer le formulaire.
    Une erreur s'est produite lors de l'envoi du formulaire.

    Afficher les détails :
    La réponse SOAP indique une erreur :
    Le serveur n?a pu lire la demande. --> Il existe une erreur dans le document XML (1 409). -->Le cast spécifié n?est pas valide.
  14. Fermez la fenêtre d?aperçu, puis renvoyez le formulaire en mode Création.
Pour résoudre ce problème, utilisez l'une ou l'autre des méthodes qui sont mentionnées dans la section « Résolution » de cet article.

Propriétés

Numéro d'article: 826989 - Dernière mise à jour: vendredi 23 février 2007 - Version: 4.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Office InfoPath 2003
  • Microsoft Office InfoPath 2003, Service Pack 1 (SP1)
Mots-clés : 
kbtshoot kbprb kbbug KB826989
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com