PRB: InfoPath가 구조화된 XML 데이터를 웹 서비스로 자동으로 전송할 수 없다

기술 자료 번역 기술 자료 번역
기술 자료: 826989 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

현상

기본으로 제공되는 InfoPath 전송 기능을 사용하여 InfoPath 양식에서 웹 서비스로 정보를 전송할 때 다음 현상 중 하나가 나타날 수 있습니다.
  • 오류 메시지가 나타날 수 있습니다. 나타나는 오류 메시지는 전송되고 있는 정보와 웹 서비스에서 호출되고 있는 메서드의 코딩에 따라 달라집니다.

    -또는-
  • 예기치 않은 데이터가 웹 서비스로 전송될 수 있습니다.
이 문서에서는 다음에 대해서도 설명합니다.
  • InfoPath가 웹 서비스로 데이터를 전송하는 방법
  • InfoPath 양식의 내용을 웹 서비스로 전송하는 두 가지 방법

원인

InfoPath는 웹 서비스로 데이터를 전송할 때 매개 변수로 선택된 XML 노드의 내용을 전송하지만 XML 노드 자체를 전송하지는 않습니다. 이것은 일반적으로 문제없이 작동됩니다. 예를 들어, 다음과 같은 웹 서비스 메서드가 있는 경우
[WebMethod]
   public void SendSampleString( string sampleString )
   {
      //Do something interesting with the sample string.
   } 
이 웹 서비스 메서드로 다음 XML 요소를 전송하면 예상한 대로 sampleString 매개 변수가 "Hello, World!"로 채워집니다.
<sampleElement>"Hello, World!"</sampleElement>
하지만, 이 때문에 XML 노드나 InfoPath 양식 전체를 웹 서비스로 전송하기가 어려워질 수 있습니다. 예를 들어, 다음과 같은 웹 서비스 메서드가 있는 경우
[WebMethod]
   public string SendXMLElement( System.Xml.XmlElement theElement )
   {
      //Report how many children the submitted node had.
      return "Node with " + theElement.ChildNodes.Count + " children submitted.";
   }
기본으로 제공된 InfoPath 전송 기능을 사용하여 예제 XML 요소를 이 메서드로 전송하면 theElement 매개 변수의 내용이 오류를 생성합니다. 이 오류는 XML 요소의 내용("Hello, World!")만 웹 서비스 메서드로 전송되기 때문에 발생합니다. 문자열이 유효한 XML 요소가 아니기 때문에 .NET Framework는 오류를 생성하고 오류 메시지가 InfoPath에 나타납니다.

InfoPath 양식 전체를 예제 웹 서비스 메서드로 전송하려는 경우에도 비슷한 문제가 발생합니다. 이 경우 InfoPath는 InfoPath 양식의 모든 하위 노드를 전송하지만 루트 노드는 전송하지 않습니다. 이렇게 되면 최상위 XML 노드가 여러 개 전송되게 됩니다. 이것도 유효한 XML이 아니기 때문에 .NET Framework는 첫 번째 최상위 XML 노드를 선택하여 theElement 매개 변수로 사용합니다. 다른 모든 노드는 무시되므로 전송되지 않은 것처럼 나타납니다.

해결 방법

이 문제를 해결하려면 사용자 지정 전송 작업을 스크립트로 작성해야 합니다. 다음 방법 중 하나를 사용할 수 있습니다.
  • 보조 데이터 원본을 사용하여 전송 작업을 수행합니다.

    -또는-
  • 사용자 지정 SOAP 메시지를 만들어서 웹 서비스로 보내는 코드를 작성합니다.

보조 데이터 원본 사용

  1. 도구 메뉴에서 보조 데이터 원본을 누릅니다.
  2. 보조 데이터 원본 대화 상자에서 추가를 누릅니다.
  3. 데이터 원본 설치 마법사의 첫 페이지에서 웹 서비스를 누르고 다음을 누릅니다.
  4. 전송할 웹 서비스의 위치를 입력하고 다음을 누릅니다.
  5. 사용할 웹 서비스 메서드를 선택하고 다음을 누릅니다.
  6. InfoPath가 웹 서비스 메서드의 매개 변수를 채우는 데 사용할 양식의 필드나 그룹을 선택하라는 메시지를 표시하면 매개 변수를 공백으로 두고 다음을 누릅니다.
  7. "양식을 열 때 이 보조 데이터 원본에 연결" 확인란을 선택 취소하고 마침을 누른 다음 확인을 눌러서 보조 데이터 원본 대화 상자를 닫습니다.
  8. 도구 메뉴에서 양식 전송을 누릅니다.
  9. 양식 전송 대화 상자에서 전송 사용을 누릅니다.
  10. 전송 목록에서 사용자 지정 스크립트를 사용하여 전송을 누른 다음 확인을 눌러서 Microsoft Script Editor를 엽니다.
  11. XDocument::OnSubmitRequest 메서드에서 다음과 같은 스크립트를 사용하여 양식 전체를 전송합니다.

    참고 양식에 있는 개별 요소를 전송할 수도 있습니다.
    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;
       }

코드 작성

  1. 도구 메뉴에서 양식 전송을 누릅니다.
  2. 양식 전송 대화 상자에서 전송 사용을 누릅니다.
  3. 전송 목록에서 사용자 지정 스크립트를 사용하여 전송을 누른 다음 확인을 눌러서 Microsoft Script Editor를 엽니다.
  4. XDocument::OnSubmitRequest 메서드에서 다음과 같은 스크립트를 사용하여 양식 전체를 전송합니다.

    참고 양식에 있는 개별 요소를 전송할 수도 있습니다.
    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); 
       }
이것은 의도적으로 설계된 동작입니다.

추가 정보

문제를 재현하는 방법

  1. 다음 두 메서드가 포함된 웹 서비스를 만듭니다.
    • 메서드 1
      [WebMethod]
         public void SendSampleString( string sampleString )
         {
            //Do something interesting with the sample string.
         } 
    • 메서드 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. 데이터 원본에서 새로 만들기를 선택하여 새 InfoPath 양식을 디자인합니다.
  3. 데이터 원본 설치 마법사에서 웹 서비스를 선택하고 다음을 누릅니다.
  4. 데이터 받기 및 전송을 누르고 다음을 누릅니다.
  5. 데이터 받기 웹 서비스 메서드의 경우 다음 단계를 수행하십시오.
    1. 앞에서 만든 웹 서비스에 대한 URL을 입력하고 다음을 누릅니다.
    2. 작업 선택 목록에서 SendXMLElement를 누르고 다음을 누릅니다.
  6. 데이터 전송 웹 서비스 메서드의 경우 다음 단계를 수행하십시오.
    1. 앞에서 만든 웹 서비스에 대한 URL을 입력하고 다음을 누릅니다.
    2. 작업 선택 목록에서 SendXMLElement를 누르고 다음을 누릅니다.
  7. 수정 단추를 눌러서 전송 작업에 대한 매개 변수를 선택합니다.
  8. dataFields 목록에서 SendXMLElementResult를 누른 다음 확인을 누르고 다음을 누릅니다.
  9. 데이터 보기 먼저 디자인을 선택한 다음 마침을 눌러서 데이터 원본 설치 마법사 대화 상자를 닫습니다.
  10. 양식에 SendXMLElementResult 필드를 추가합니다.
  11. 미리 보기로 양식을 봅니다.
  12. XML 노드 결과 전송 컨트롤에 Hello, World!를 입력합니다.
  13. 파일 메뉴에서 전송을 누릅니다.

    아래와 같은 오류 메시지가 나타납니다.
    양식을 전송할 수 없습니다.
    양식 전송 중 오류가 발생했습니다.

    자세한 정보 표시:
    SOAP 응답은 다음 오류가 발생했음을 나타냅니다:
    서버에서 요청을 읽을 수 없습니다. --> XML 문서(1,409)에 오류가 있습니다. -->지정한 캐스트가 잘못되었습니다.
  14. 미리 보기 창을 닫은 다음 양식을 디자인 모드로 되돌아가게 합니다.
이 문제를 해결하려면 이 문서의 "해결" 절에서 설명한 방법 중 하나를 사용하십시오.



Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹에 참여하시기 바랍니다.

속성

기술 자료: 826989 - 마지막 검토: 2003년 12월 8일 월요일 - 수정: 3.2
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Office InfoPath 2003
키워드:?
kbbug kbprb KB826989

피드백 보내기

 

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