Não é possível submeter automaticamente estruturados dados XML a um serviço Web no InfoPath 2003

Traduções de Artigos Traduções de Artigos
Artigo: 826989 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando submete informações do InfoPath funcionalidade de submissão formulário num serviço Web utilizando o InfoPath incorporado, poderá detectar um dos seguintes sintomas:
  • Poderá receber uma mensagem de erro. A mensagem de erro que recebe varia de acordo com as informações que está a ser submetidas e a codificação do método que está a ser invocado no serviço Web.
  • Poderá notar que os dados inesperados é submetidos ao serviço Web.
Este artigo também aborda o seguinte:
  • O InfoPath submete dados a um serviço Web.
  • Dois métodos para submeter o conteúdo de um formulário do InfoPath a um serviço Web.

Causa

Quando o InfoPath submete dados a um serviço Web, submete o conteúdo do nó XML que foi seleccionado como um parâmetro, mas não submeter o nó XML próprio. Isto geralmente funciona correctamente. Por exemplo, tem um método de serviço Web como o seguinte:
[WebMethod]
   public void SendSampleString( string sampleString )
   {
      //Do something interesting with the sample string.
   } 
se enviar o seguinte elemento XML para este método de serviço Web, o parâmetro sampleString é preenchido com "Hello, World!" (como previsto).
<sampleElement>"Hello, World!"</sampleElement>
Infelizmente, este comportamento pode dificultar a submeter o formulário do InfoPath todo a um serviço Web ou de nós XML. Por exemplo, tem um método de serviço Web como o seguinte: cadeia pública
[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 submeter o elemento XML de exemplo para este método utilizando o InfoPath incorporado funcionalidade de submissão, o conteúdo do parâmetro theElement gerar um erro. Este erro ocorre porque apenas o conteúdo do elemento XML ("Hello, World!") são enviadas para o método de serviço Web. Uma vez que a cadeia não é um elemento XML válido, o .NET Framework gera um erro; a mensagem de erro aparece no InfoPath.

Um problema semelhante ocorre se tentar submeter o formulário InfoPath completo para o método do serviço Web de exemplo. Neste caso, o InfoPath submete todos os nós subordinados do formulário do InfoPath, mas não submeter o nó raiz. Isto resulta em vários nós XML nível superior submetidos. Uma vez que este também não é XML válido, o .NET Framework selecciona o primeiro nó XML de nível superior e utiliza-o como parâmetro theElement . Todos os outros nós são ignorados e desta forma, o aspecto que estas não foram submetidas.

Resolução

Este problema é corrigido no Microsoft Office 2003 Service Pack 1. Para resolver este problema, obtenha o service pack mais recente do Microsoft Office 2003.

Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
870924Como obter o service pack mais recente do Office 2003

Como contornar

Para contornar este problema, um dicionário de escrita acção de submissão no script. Pode utilizar um dos seguintes métodos:
  • Utilize uma origem de dados secundária para executar a operação de submissão.
  • Escreva código que cria uma mensagem SOAP personalizada e que envia-o para o serviço Web.

Utilizar uma origem de dados secundária

  1. No menu Ferramentas , clique em Origens de dados secundárias .
  2. Na caixa de diálogo Origens de dados secundárias , clique em Adicionar .
  3. Na primeira página do Assistente de configuração de origens de dados , clique em Serviço Web e, em seguida, clique em seguinte .
  4. Introduza a localização do serviço Web que pretende submeter e, em seguida, clique em seguinte .
  5. Seleccione o método de serviço Web que pretende utilizar e, em seguida, clique em seguinte .
  6. Quando o InfoPath pede para seleccionar o campo ou grupo do formulário que será utilizado para preencher os parâmetros do método do serviço do Web, deixe os parâmetros em branco e, em seguida, clique em seguinte .
  7. Clique para desmarcar a caixa de verificação "Ligar a esta origem de dados secundária quando o formulário for aberto" , clique em Concluir e, em seguida, clique em OK para fechar a caixa de diálogo Origens de dados secundárias .
  8. No menu Ferramentas , clique em ' Submeter formulários '.
  9. Na caixa de diálogo Submeter formulários , clique em Activar submeter .
  10. Na lista Submeter , clique em Submeter utilizando script personalizado e, em seguida, clique em OK para abrir o Editor de scripts.
  11. Método XDocument::OnSubmitRequest , utilize o script como o script a seguir para submeter o formulário completo.

    Nota Pode também submeter elementos individuais do formulário. Tente
    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;
       }

Escrever código

  1. No menu Ferramentas , clique em ' Submeter formulários '.
  2. Na caixa de diálogo Submeter formulários , clique em Activar submeter .
  3. Na lista Submeter , clique em Submeter utilizando script personalizado e, em seguida, clique em OK para abrir o Editor de scripts.
  4. Método XDocument::OnSubmitRequest , utilize o script como o script a seguir para submeter o formulário completo.

    Nota Pode também submeter elementos individuais do formulário.
    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); 
       }

Ponto Da Situação

Este comportamento ocorre por predefinição.

Este comportamento ocorre por predefinição no Microsoft Office InfoPath 2003. Este comportamento é alterado pelo Microsoft Office InfoPath 2003 Service Pack 1.

Mais Informação

Passos para reproduzir o comportamento

  1. Crie um serviço Web que contém os seguintes dois métodos:
    • 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. Estrutura um novo formulário do InfoPath seleccionando Novo a partir de origem de dados .
  3. No Assistente de configuração de origens de dados , seleccione o Serviço Web e, em seguida, clique em seguinte .
  4. Clique em receber e submeter dados e, em seguida, clique em seguinte .
  5. Para o receber dados método do serviço Web, siga estes passos:
    1. Introduza o URL para o serviço Web que criou anteriormente e, em seguida, clique em seguinte .
    2. Na lista Seleccionar uma operação , clique em SendXMLElement e, em seguida, clique em seguinte .
  6. Para a Submeter dados método do serviço Web, siga estes passos:
    1. Introduza o URL para o serviço Web que criou anteriormente e, em seguida, clique em seguinte .
    2. Na lista Seleccionar uma operação , clique em SendXMLElement e, em seguida, clique em seguinte .
  7. Clique no botão Modificar para seleccionar um parâmetro para a operação de submissão.
  8. Na lista ' dataFields ' , clique em SendXMLElementResult , clique em OK e, em seguida, clique em seguinte .
  9. Seleccione desenhar primeiro a vista de dados e, em seguida, clique em Concluir para fechar a caixa de diálogo do Assistente de configuração de origens de dados .
  10. Adicione o campo SendXMLElementResult ao formulário.
  11. Pré-visualize o formulário.
  12. No controlo Enviar resultados de nó de XML , escreva Hello, World!
  13. No menu ficheiro , clique em Submeter .

    Receberá a seguinte mensagem de erro:
    O InfoPath não consegue submeter o formulário.
    Ocorreu um erro enquanto o formulário foi submetido.

    Mostrar detalhes:
    A resposta ' SOAP indica que ocorreu um erro:
    Servidor não conseguiu ler o pedido. --> Daí é um erro no documento XML (1,409). --> Matiz especificada não é válido.
  14. Feche a janela de pré-visualização e volte o formulário para o modo de estrutura.
Para resolver este problema, utilize um dos métodos que são mencionados na secção "Resolução" deste artigo.

Propriedades

Artigo: 826989 - Última revisão: 28 de julho de 2006 - Revisão: 4.3
A informação contida neste artigo aplica-se a:
  • Microsoft Office InfoPath 2003
  • Microsoft Office InfoPath 2003, Service Pack 1 (SP1)
Palavras-chave: 
kbmt kbtshoot kbprb kbbug KB826989 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 826989

Submeter comentários

 

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