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

O suporte para o Office 2003 terminou

A Microsoft terminou o suporte para o Office 2003 em 8 de Abril de 2014. Esta alteração afetou as suas atualizações de software e opções de segurança. Aprenda o que isto significa para si e como pode ficar protegido.

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
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
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.

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 826989 - Última Revisão: 01/11/2015 05:20:22 - Revisão: 4.3

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

  • kbnosurvey kbarchive kbmt kbtshoot kbprb kbbug KB826989 KbMtpt
Comentários
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)