Il tuo browser non è supportato

Devi aggiornare il browser per usare il sito.

Esegui l'aggiornamento all'ultima versione di Internet Explorer

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

Il supporto per Office 2003 è terminato

Il supporto Microsoft per Office 2003 è terminato l'8 aprile 2014. Questa modifica ha interessato gli aggiornamenti software e le opzioni di sicurezza. Ulteriori informazioni su come continuare a essere protetti.

Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
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à

ID articolo: 826989 - Ultima revisione: 01/11/2015 05:20:19 - Revisione: 4.4

  • Microsoft Office InfoPath 2003
  • Microsoft Office InfoPath 2003 Service Pack 1 (SP1)
  • kbnosurvey kbarchive kbtshoot kbprb kbbug KB826989
Feedback