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

Le support d'Office 2003 a pris fin

Microsoft a mis fin au support d'Office 2003 le 8 avril 2014. Cette modification a affecté vos mises à jour logicielles et options de sécurité. Découvrez les implications de ce changement à votre niveau et la marche à suivre pour rester protégé.

Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
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

ID d'article : 826989 - Dernière mise à jour : 01/11/2015 05:20:17 - Révision : 4.1

Microsoft Office InfoPath 2003, Microsoft Office InfoPath 2003, Service Pack 1 (SP1)

  • kbnosurvey kbarchive kbtshoot kbprb kbbug KB826989
Commentaires