No puede enviar automáticamente estructurados datos XML a un servicio Web en InfoPath 2003

Seleccione idioma Seleccione idioma
Id. de artículo: 826989 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Al enviar información desde InfoPath un formulario a un servicio Web utilizando el integradas en InfoPath funcionalidad de envío, puede experimentar uno de los síntomas siguientes:
  • Puede recibir un mensaje de error. El mensaje de error que reciba varía según la información que se están enviando a la codificación del método que se invoca en el servicio Web.
  • Puede observar que se envían datos inesperados al servicio Web.
Este artículo también explica lo siguiente:
  • Cómo InfoPath envía los datos a un servicio Web.
  • Dos métodos para enviar el contenido de un formulario de InfoPath a un servicio Web.

Causa

Cuando InfoPath envía los datos a un servicio Web, envía el contenido del nodo XML que se ha seleccionado como un parámetro, pero no envía el propio nodo XML. Esto generalmente funciona bien. Por ejemplo, tiene un método de servicio Web como la siguiente:
[WebMethod]
   public void SendSampleString( string sampleString )
   {
      //Do something interesting with the sample string.
   } 
si enviar el siguiente elemento XML a este método de servicio Web, el parámetro sampleString se rellena con "Hello, World!" (como se esperaba).
<sampleElement>"Hello, World!"</sampleElement>
Desafortunadamente, esto puede dificultar enviar todo el formulario InfoPath a un servicio Web o de nodos XML. Por ejemplo, tiene un método de servicio Web como la siguiente:
[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 enviar el elemento XML de ejemplo a este método con el InfoPath integrado funcionalidad de envío, el contenido del parámetro theElement generará un error. Este error se produce porque sólo el contenido del elemento XML ("Hello, World!"), se envía al método de servicio Web. Puesto que la cadena no es un elemento XML válido, se genera un error en .NET Framework; la mensaje de error aparecerá en InfoPath.

Un problema similar se produce si intenta enviar el formulario de InfoPath todo el método de servicio Web de ejemplo. En este caso, InfoPath envía todos los nodos secundarios del formulario de InfoPath, pero no envía el nodo raíz. Esto produce varios nodos XML de nivel superior que se envía. Como también no es válida en XML, .NET Framework selecciona el primer nodo XML de nivel superior y se utiliza como el parámetro theElement . Se omiten todos los demás nodos y el aspecto que no se enviaron.

Solución

Este problema se corrigió en Microsoft Office 2003 Service Pack 1. Para resolver este problema, obtenga el service pack más reciente para Microsoft Office 2003.

Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
870924Cómo obtener el service pack más reciente para Office 2003

Solución

Para evitar este problema, escritura un personalizado enviar acción en la secuencia de comandos. Puede utilizar cualquiera de los métodos siguientes:
  • Utilizar un origen de datos secundario para realizar la operación de envío.
  • Escribir código que crea un mensaje SOAP personalizado y lo envía al servicio Web.

Usar una fuente secundaria de datos

  1. En el menú Herramientas , haga clic en Orígenes de datos secundarios .
  2. En el cuadro de diálogo Orígenes de datos secundarios , haga clic en Agregar .
  3. En la primera página del Asistente para configuración de orígenes de datos , haga clic en Servicio Web y, a continuación, haga clic en siguiente .
  4. Escriba la ubicación del servicio Web que desee enviar y, a continuación, haga clic en siguiente .
  5. Seleccione el método de servicio Web que desee utilizar y, a continuación, haga clic en siguiente .
  6. Cuando InfoPath le pedirá que seleccione el campo o grupo en el formulario que se utilizará para rellenar los parámetros del método de servicios Web, los parámetros en blanco y, a continuación, haga clic en siguiente .
  7. Haga clic para desactivar la casilla "Conectarse a este origen de datos secundaria cuando se abre el formulario" , haga clic en Finalizar y a continuación, haga clic en Aceptar para cerrar el cuadro de diálogo Orígenes de datos secundarios .
  8. En el menú Herramientas , haga clic en Enviar formularios .
  9. En el cuadro de diálogo Enviar formularios , haga clic en Habilitar envío .
  10. En la lista Enviar , haga clic en Enviar mediante secuencias de comandos personalizada y, a continuación, haga clic en Aceptar para abrir el Editor de secuencias de comandos.
  11. En el método XDocument::OnSubmitRequest , utilizar secuencias de comandos como la siguiente secuencia de comandos para enviar todo el formulario.

    Nota También puede enviar elementos individuales en el formulario.
    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;
       }

Escribir código

  1. En el menú Herramientas , haga clic en Enviar formularios .
  2. En el cuadro de diálogo Enviar formularios , haga clic en Habilitar envío .
  3. En la lista Enviar , haga clic en Enviar mediante secuencias de comandos personalizada y, a continuación, haga clic en Aceptar para abrir el Editor de secuencias de comandos.
  4. En el método XDocument::OnSubmitRequest , utilizar secuencias de comandos como la siguiente secuencia de comandos para enviar todo el formulario.

    Nota También puede enviar elementos individuales en el formulario.
    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); 
       }

Estado

Este comportamiento es por diseño.

Este comportamiento es por diseño en Microsoft Office InfoPath 2003. Este comportamiento se modifica mediante Office InfoPath 2003 Service Pack 1.

Más información

Pasos para reproducir el comportamiento

  1. Crear un servicio Web que contiene los dos métodos siguientes:
    • Método 1
      [WebMethod]
         public void SendSampleString( string sampleString )
         {
            //Do something interesting with the sample string.
         } 
    • Método 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. Diseñar un nuevo formulario de InfoPath al seleccionar nuevo de origen de datos .
  3. En el Asistente para configuración de orígenes de datos , seleccione Servicio Web y, a continuación, haga clic en siguiente .
  4. Haga clic en recibir y enviar datos y, a continuación, haga clic en siguiente .
  5. Para el recibir datos de método de servicio Web, siga estos pasos:
    1. Escriba la dirección URL al servicio Web que creó anteriormente y, a continuación, haga clic en siguiente .
    2. En la lista Seleccione una operación , haga clic en SendXMLElement y, a continuación, haga clic en siguiente .
  6. Para el enviar datos del método de servicio Web, siga estos pasos:
    1. Escriba la dirección URL al servicio Web que creó anteriormente y, a continuación, haga clic en siguiente .
    2. En la lista Seleccione una operación , haga clic en SendXMLElement y, a continuación, haga clic en siguiente .
  7. Haga clic en el botón Modificar para elegir un parámetro para la operación de envío.
  8. En la lista dataFields , haga clic en SendXMLElementResult , haga clic en Aceptar y, a continuación, haga clic en siguiente .
  9. Seleccione Diseñar primero la vista de datos y, a continuación, haga clic en Finalizar para cerrar el cuadro de diálogo Asistente para configuración de orígenes de datos .
  10. Agregue el campo SendXMLElementResult al formulario.
  11. Obtener una vista previa del formulario.
  12. En el control Enviar resultados de nodo de XML , escriba Hello, World!
  13. En el menú archivo , haga clic en Enviar .

    Recibirá el siguiente mensaje de error:
    InfoPath no puede enviar el formulario.
    Error mientras se se envió el formulario.

    Mostrar detalles:
    La respuesta SOAP indica que se ha producido un error:
    Servidor no pudo leer la solicitud. --> Allí es un error en el documento XML (1,409). --> Conversión especificada no es válida.
  14. Cerrar la ventana Vista previa y vuelva el formulario al modo diseño.
Para resolver este problema, utilice cualquiera de los métodos que se mencionan en la sección "Solución" de este artículo.

Propiedades

Id. de artículo: 826989 - Última revisión: viernes, 28 de julio de 2006 - Versión: 4.3
La información de este artículo se refiere a:
  • Microsoft Office InfoPath 2003
  • Microsoft Office InfoPath 2003, Service Pack 1 (SP1)
Palabras clave: 
kbmt kbtshoot kbprb kbbug KB826989 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 826989

Enviar comentarios

 

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