ImpossibilitÓ di inviare automaticamente dati XML strutturati a un servizio Web in InfoPath 2003

Traduzione articoli Traduzione articoli
Identificativo articolo: 826989 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando si inviano informazioni da un modulo di InfoPath a un servizio Web mediante la funzionalitÓ di invio incorporata in InfoPath, potrebbe manifestarsi uno dei seguenti sintomi:
  • Potrebbe essere visualizzato un messaggio di errore. Il messaggio di errore visualizzato varia a seconda delle informazioni che si stanno inviando e della codifica del metodo richiamato sul servizio Web.
  • Potrebbe verificarsi l'invio al servizio Web di dati imprevisti.
In questo articolo vengono inoltre discussi i seguenti argomenti:
  • ModalitÓ di invio di dati a un servizio Web in InfoPath.
  • Due metodi per l'invio del contenuto di un modulo di InfoPath a un servizio Web.

Cause

In InfoPath, quando vengono inviati dati a un servizio Web, viene inviato il contenuto del nodo XML selezionato come parametro, ma non il nodo XML stesso. In genere, questo metodo produce i risultati attesi. Si supponga, ad esempio, di disporre del seguente metodo di servizio Web:
[WebMethod]
   public void SendSampleString( string sampleString )
   {
      //Do something interesting with the sample string.
   } 
Se si invia a tale metodo di servizio Web l'elemento XML descritto di seguito, il parametro sampleString verrÓ compilato con la stringa "Hello, World!" (come previsto).
<sampleElement>"Hello, World!"</sampleElement>
Tuttavia, tale comportamento pu˛ rendere difficoltoso l'invio di nodi XML o dell'intero modulo di InfoPath a un servizio Web. Si supponga, ad esempio, di disporre del seguente metodo di servizio Web:
[WebMethod]
   public string SendXMLElement( System.Xml.XmlElement theElement )
   {
      //Report how many children the submitted node had.
      return "Node with " + theElement.ChildNodes.Count + " children submitted.";
   }
Se si invia a tale metodo l'elemento XML dell'esempio mediante la funzionalitÓ di invio incorporata in InfoPath, verrÓ generato un errore a causa del contenuto del parametro theElement. L'errore si verifica perchÚ solo il contenuto dell'elemento XML ("Hello, World!") viene inviato al metodo di servizio Web. Dal momento che la stringa non Ŕ un elemento XML valido, viene generato un errore di .NET Framework e visualizzato in InfoPath il relativo messaggio di errore.

Un problema analogo si verifica quando si tenta di inviare l'intero modulo di InfoPath al metodo di servizio Web dell'esempio. In tale caso, vengono inviati tutti i nodi figlio del modulo di InfoPath, ma non il nodo radice. Ne consegue l'invio di pi¨ nodi XML di primo livello. PoichÚ anche in questo caso l'elemento non Ŕ un elemento XML valido, in .NET Framework viene selezionato e utilizzato come parametro theElement il primo nodo XML di primo livello. Tutti gli altri nodi vengono ignorati e l'utente potrebbe supporre che non siano stati inviati.

Risoluzione

Questo problema Ŕ stato corretto in Microsoft Office 2003 Service Pack 1. Per risolvere il problema, procurarsi l'ultimo service pack per Microsoft Office 2003.

Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito:
870924 Come ottenere il service pack pi¨ recente per Office 2003

Workaround

Per aggirare questo problema, scrivere mediante script un'azione di invio personalizzata. Tale operazione pu˛ essere effettuata tramite uno dei seguenti metodi:
  • Utilizzo di un'origine dati secondaria per eseguire l'operazione di invio.
  • Scrittura di codice che consenta la creazione di un messaggio SOAP personalizzato e l'invio di questo al servizio Web.

Utilizzo di un'origine dati secondaria

  1. Scegliere Origini dati secondarie dal menu Strumenti.
  2. Nella finestra di dialogo Origini dati secondarie scegliere Aggiungi.
  3. Nella prima pagina della Configurazione guidata origine dati selezionare Servizio Web e scegliere Avanti.
  4. Immettere il percorso del servizio Web da inviare, quindi scegliere Avanti.
  5. Selezionare il metodo di servizio Web da utilizzare, quindi scegliere Avanti.
  6. Alla richiesta di selezionare il campo o il gruppo del modulo che sarÓ utilizzato per la compilazione dei parametri del metodo di servizio Web, lasciare vuoti i parametri e scegliere Avanti.
  7. Deselezionare la casella di controllo Effettua connessione a questa origine dati secondaria all'apertura del modulo, scegliere Fine, quindi OK per chiudere la finestra di dialogo Origini dati secondarie.
  8. Scegliere Invio moduli dal menu Strumenti.
  9. Nella finestra di dialogo Invio moduli selezionare Consentito.
  10. Nell'elenco ModalitÓ invio fare clic su Invia tramite script personalizzato, quindi scegliere OK per aprire Microsoft Script Editor.
  11. Nel metodo XDocument::OnSubmitRequest utilizzare uno script quale quello descritto di seguito per inviare l'intero modulo.

    Nota ╚ anche possibile inviare singoli elementi del modulo.
    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;
       }

Scrittura di codice

  1. Scegliere Invio moduli dal menu Strumenti.
  2. Nella finestra di dialogo Invio moduli selezionare Consentito.
  3. Nell'elenco ModalitÓ invio fare clic su Invia tramite script personalizzato, quindi scegliere OK per aprire Microsoft Script Editor.
  4. Nel metodo XDocument::OnSubmitRequest utilizzare uno script quale quello descritto di seguito per inviare l'intero modulo.

    Nota ╚ anche possibile inviare singoli elementi del modulo.
    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); 
       }

Status

Si tratta di un comportamento legato alla progettazione del prodotto.

Questo comportamento Ŕ legato alla progettazione di Microsoft Office InfoPath 2003 ed Ŕ stato modificato in Microsoft Office InfoPath 2003 Service Pack 1.

Informazioni

Procedura per riprodurre il problema

  1. Creare un servizio Web che contenga i due seguenti metodi:
    • Metodo 1
      [WebMethod]
         public void SendSampleString( string sampleString )
         {
            //Do something interesting with the sample string.
         } 
    • Metodo 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. Progettare un nuovo modulo di InfoPath selezionando Nuovo da origine dati.
  3. Nella Configurazione guidata origine dati selezionare Servizio Web e scegliere Avanti.
  4. Selezionare Ricezione e invio dati e scegliere Avanti.
  5. Per il metodo di servizio Web per la ricezione di dati, attenersi alla seguente procedura:
    1. Immettere l'URL del servizio Web precedentemente creato, quindi scegliere Avanti.
    2. Nell'elenco Selezionare un'operazione fare clic su SendXMLElement, quindi scegliere Avanti.
  6. Per il metodo di servizio Web per l'invio di dati, attenersi alla seguente procedura:
    1. Immettere l'URL del servizio Web precedentemente creato, quindi scegliere Avanti.
    2. Nell'elenco Selezionare un'operazione fare clic su SendXMLElement, quindi scegliere Avanti.
  7. Scegliere Modifica per selezionare un parametro per l'operazione di invio.
  8. Nell'elenco dataFields fare clic su SendXMLElementResult, scegliere OK, quindi Avanti.
  9. Selezionare Progetta visualizzazione Immissione dati, quindi scegliere Fine per chiudere la finestra di dialogo Configurazione guidata origine dati.
  10. Aggiungere il campo SendXMLElementResult al modulo.
  11. Visualizzare l'anteprima del modulo.
  12. Nel controllo Send XML Node Result digitare Hello, World!
  13. Scegliere Invia dal menu File.

    Viene visualizzato il messaggio di errore seguente:
    Impossibile inviare il modulo.
    Errore durante l'invio del modulo.

    Mostra dettagli:
    La risposta SOAP indica che si Ŕ verificato un errore:
    Impossibile leggere la richiesta. --> Errore nel documento XML (1.409). -->Cast specificato non valido.
  14. Chiudere la finestra di anteprima e ritornare al modulo in modalitÓ progettazione.
Per risolvere questo problema, utilizzare uno dei metodi descritti nella sezione "Risoluzione" di questo articolo.

ProprietÓ

Identificativo articolo: 826989 - Ultima modifica: venerdý 8 giugno 2007 - Revisione: 4.4
Le informazioni in questo articolo si applicano a
  • Microsoft Office InfoPath 2003
  • Microsoft Office InfoPath 2003 Service Pack 1 (SP1)
Chiavi:á
kbtshoot kbprb kbbug KB826989
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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