InfoPath 2003 で構造化 XML データを Web サービスに自動的に送信できない

Office 2003 のサポートは終了しました

マイクロソフトでは、2014 年 4 月 8 日に Office 2003 のサポートを終了しました。この変更は、ソフトウェアの更新プログラムおよびセキュリティ オプションに影響しています。 この変更の意味および保護された状態を維持する方法について説明します。

この資料は、アーカイブされました。これは "現状のまま" で提供され、更新されることはありません。
現象
InfoPath 組み込みの送信機能を使用して、InfoPath フォームから Web サービスに情報を送信するとき、以下のいずれかの現象が発生することがあります。
  • エラー メッセージが表示される場合があります。表示されるエラー メッセージは、送信される情報および Web サービスで呼び出されるメソッドのコーディングによって異なります。
  • Web サービスに予期しないデータが送信される場合があります。
また、この資料では以下の点についても説明します。
  • InfoPath から Web サービスにデータを送信する方法。
  • InfoPath フォームのコンテンツを Web サービスに送信する 2 つのメソッド。
原因
InfoPath がデータを Web サービスに送信するとき、パラメータとして選択された XML ノードのコンテンツを送信しますが、XML ノード自体は送信しません。通常はこれで適切に機能します。たとえば、次のような Web サービス メソッドがあるとします。
[WebMethod]   public void SendSampleString( string sampleString )   {      //Do something interesting with the sample string.   } 
この Web サービス メソッドに以下の XML 要素を送信すると、sampleString パラメータには (期待どおりに) "Hello, World" が設定されます。
<sampleElement>"Hello, World!"</sampleElement>
残念ながら、この動作では XML ノード、または InfoPath フォーム全体を Web サービスに送信するのが困難です。たとえば、次のような 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.";   }
組み込みの InfoPath 送信機能を使用して、このメソッドにサンプル XML 要素を送信すると、theElement パラメータのコンテンツがエラーを発生します。このエラーは、XML 要素のコンテンツ ("Hello, World!") のみが Web サービス メソッドに送信されるため発生します。文字列が有効な XML 要素ではないため、.NET Framework がエラーを生成し、エラー メッセージが InfoPath に表示されます。

InfoPath フォーム全体をサンプル Web サービス メソッドに送信する場合も、同様の問題が発生します。この場合、InfoPath は InfoPath フォームのすべての子ノードを送信しますが、ルート ノードは送信しません。そのため、複数の最上位レベルの XML ノードが送信されます。これも有効な XML ではないので、.NET Framework は最初の最上位レベルの XML ノードを選択し、そのノードを theElement パラメータとして使用します。それ以外のすべてのノードは無視され、送信されないという現象になります。
解決方法
この問題は、Microsoft Office 2003 Service Pack 1 で修正されています。この問題を解決するには、Microsoft Office 2003 の最新の Service Pack を入手します。

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
870924 最新の Office 2003 Service Pack を入手する方法
回避策
この問題を回避するには、カスタム送信アクションをスクリプトで作成します。以下のいずれかの方法を使用できます。
  • セカンダリ データ ソースを使用して、送信操作を実行します。
  • カスタム SOAP メッセージを作成し、それを Web サービスに送信するコードを作成します。

セカンダリ データ ソースを使用する

  1. [ツール] メニューの [セカンダリ データ ソース] をクリックします。
  2. [セカンダリ データ ソース] ダイアログ ボックスで、[追加] をクリックします。
  3. [データ ソース セットアップ ウィザード] の最初のページで、[Web サービス] をクリックし、[次へ] をクリックします。
  4. 送信する Web サービスの場所を入力し、[次へ] をクリックします。
  5. 使用する Web サービス メソッドを選択し、[次へ] をクリックします。
  6. Web サービス メソッドのパラメータの設定に使用するフィールドまたはグループをフォームから選択するように求めるメッセージが表示されたら、パラメータを空白のままにして、[次へ] をクリックします。
  7. [フォームを開くときに、このセカンダリ データ ソースに接続する] チェック ボックスをオフにし、[完了] をクリックします。次に [閉じる] をクリックして、[セカンダリ データ ソース] ダイアログ ボックスを閉じます。
  8. [ツール] メニューの [フォームの送信] をクリックします。
  9. [フォームの送信] ダイアログ ボックスで、[送信を許可する] をクリックします。
  10. [送信] ボックスの一覧で、[カスタム スクリプトを使って送信] をクリックします。次に [OK] をクリックして、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. [送信] ボックスの一覧で、[カスタム スクリプトを使って送信] をクリックします。次に [OK] をクリックして、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);    }
状況
この動作は仕様です。

この動作は Microsoft Office InfoPath 2003 の仕様です。この動作は、Microsoft Office InfoPath 2003 Service Pack 1 で変更されています。
詳細

現象の再現手順

  1. 以下の 2 つのメソッドを含む Web サービスを作成します。
    • メソッド 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. データ ソース セットアップ ウィザードで、[Web サービス] をクリックし、[次へ] をクリックします。
  4. [データの受信と送信] をクリックし、[次へ] をクリックします。
  5. データの受信 Web サービス メソッドの場合、以下の手順に従います。
    1. 上記で作成した Web サービスの URL を入力し、[次へ] をクリックします。
    2. [処理を選択してください] ボックスの一覧で、[SendXMLElement] をクリックし、[次へ] をクリックします。
  6. データの送信 Web サービス メソッドの場合、以下の手順を実行します。
    1. 上記で作成した Web サービスの URL を入力し、[次へ] をクリックします。
    2. [処理を選択してください] ボックスの一覧で、[SendXMLElement] をクリックし、[次へ] をクリックします。
  7. 送信操作のパラメータをクリックし、[変更] をクリックします。
  8. [dataFields] ボックスの一覧で [SendXMLElementResult] をクリックし、[OK] をクリックします。次に、[次へ] をクリックします。
  9. [データ ビューを最初にデザインする] をクリックしてから、[完了] をクリックし、[データ ソース セットアップ ウィザード] ダイアログ ボックスを閉じます。
  10. フォームに SendXMLElementResult フィールドを追加します。
  11. フォームをプレビューします。
  12. Send XML Node Result コントロールに、Hello, World! と入力します。
  13. [ファイル] メニューの [送信] をクリックします。

    次のエラー メッセージが表示されます。
    フォームを送信できません。
    フォームの送信中にエラーが発生しました。

    詳細の表示:
    SOAP の応答は、エラーが発生したことを示しています:
    サーバーは要求を読みとれませんでした --> XML ドキュメント (1,409) でエラーが発生しました。 -->指定されたキャストは有効ではありません。
  14. プレビュー ウィンドウを閉じ、フォームのデザイン モードに戻ります。
この問題を解決するには、この資料の「解決方法」で説明したいずれかの方法を使用します。
プロパティ

文書番号:826989 - 最終更新日: 01/11/2015 05:20:19 - リビジョン: 4.0

  • Microsoft Office InfoPath 2003
  • Microsoft Office InfoPath 2003, Service Pack 1 (SP1)
  • kbnosurvey kbarchive kbtshoot kbprb kbbug KB826989
フィードバック