目次＞ 第3章 サンプルアプリケーション構築 > 3.4 通信処理機能 > 3.4.1 XML通信

# 3.4.1 XML通信

## 概要

本節ではClient Frameworkが提供するイベント処理機能及びXML通信処理機能を用いて、クライアント・サーバ間でXML電文の送受信を行う方法を説明する。
XML通信処理を行う場合は、画面からClient Frameworkが提供するXML通信用のビジネスロジックを実行する。XML通信用のビジネスロジックは、ビジネスロジック入力データセットをXML電文に変換してサーバに送信し、サーバから受信したXML電文をビジネスロジック出力データセットに変換する。詳細は、機能説明書『FB-02 データセット変換機能』、『CM-04 ビジネスロジック生成機能』を参照のこと。

### 動作イメージ

図3.4.1-1 動作イメージ

- 対象画面
  - 計算画面
- 処理概要
  1. (クライアント)計算ボタンを押下して、イベント処理機能を実行する。
  2. (クライアント)イベント処理機能は、画面データセットにバインドされた数値A、数値Bの値をビジネスロジック入力データセットにコピーし、XML通信用ビジネスロジックを実行する。
  3. (クライアント)XML通信用ビジネスロジックは、ビジネスロジック入力データセットの値をサーバへ送信する。
  4. (サーバ)計算ビジネスロジックが数値を受け取り、数値の積を計算する。
  5. (サーバ)計算結果をクライアントへ送信する。
  6. (クライアント)XML通信用ビジネスロジックは、受信したXMLをビジネスロジック出力データセットに変換する。
  7. (クライアント)イベント処理機能は、ビジネスロジック出力データセットに格納された解の値を画面データセットにコピーし、画面に表示する。

### クライアントが送信するリクエストの仕様

リクエストヘッダにはリクエスト名"calc"を設定する。リクエスト名によって実行するビジネスロジックが決定される。 リクエストボディには、ユーザが計算画面で入力した数値Aと数値Bの情報をXMLとして設定する。

- リクエストヘッダ

表3.4.1-1 リクエストヘッダ内容

Key値 | Value値 | 内容
RequestName | calc | サーバで実行するビジネスロジックを特定するためのリクエスト名。

- リクエストボディ

      <CalcFormDs xmlns="http://com.example.dotnet/CalcFormDs.xsd">
        <CalcTable>
          <NumberA>12</NumberA>
          <NumberB>2</NumberB>
        </CalcTable>
      </CalcFormDs>

### クライアントが受信するレスポンスの仕様

画面から入力された数値の計算結果がXMLとして返却される。

- レスポンスボディ

      <CalcFormDs xmlns="http://com.example.dotnet/CalcFormDs.xsd">
        <CalcTable>
          <Answer>24</Answer>
        </CalcTable>
      </CalcFormDs>

## 作業手順

- 作成イメージ

図3.4.1-2 作業イメージ

1. 業務画面の確認
2. 画面データセットの作成
3. 画面項目と画面データセットのバインド
4. データセット変換設定ファイルの設定
5. ビジネスロジック設定ファイルの設定
6. EventControllerコンポーネントのインスタンスの追加
7. EventControllerコンポーネントのプロパティの設定
8. EventControllerコンポーネントの実行

### 1. 業務画面の確認

計算画面(CalcForm.cs)がVisual Studioのデザイナに表示されることを確認する。また、計算画面は拡張フォーム(FormBase)を継承していることを確認する。

図3.4.1-3 計算画面の確認

CalcForm.cs

    namespace TutorialClient
    {
        /// <summary>
        /// 掛け算を行う画面です。
        /// </summary>
        /// <remarks>
        /// 数値Aと数値Bの掛け算の結果を表示します。
        /// </remarks>
        public partial class CalcForm : FormBase
        {
            /// <summary>
            /// <see cref="CalcForm"/> クラスの新しいインスタンスを初期化します。
            /// </summary>
            /// <remarks>
            /// デフォルトコンストラクタです。
            /// </remarks>
            public CalcForm()
            {
                InitializeComponent();
            }
        }
    }

### 2. 画面データセットの作成

#### 2.1 画面データセットの新規作成

計算画面の画面データセット(CalcFormDs.xsd)を作成する。 第3章 3.1 画面作成時のポイントを参考にすること。

表3.4.1-2 データセットの格納場所とファイル名

ファイル格納場所 | ファイル名
\TutorialClientBlank\ViewData | CalcFormDs.xsd

表3.4.1-3 作成するデータセットの名前空間

Namespace | http://com.example.dotnet/CalcFormDs.xsd

表3.4.1-4 作成するデータセットのテーブル、カラム、データ型の一覧

Table名 | Column名 | DataType(型) | DefaultValue
CalcTable |  |  |
| Number | System.String | 空文字列
| Number | System.String | 空文字列
| Answer | System.Int32 | <DBNull>

図3.4-4 画面データセットの完成形

#### 2.2画面データセットがツールボックスに表示されることの確認

画面データセットの作成が完了したら保存し、ビルドする。ビルド後に作成したデータセットがツールボックスに表示され、コンポーネントとして利用できるようになっていることを確認する。

図3.4-5 データセットがコンポーネントに追加されている例

### 3. 画面項目と画面データセットのバインド

#### 3.1 画面データセットのインスタンスの追加

ツールボックスからデータセット「CalcFormDs」のインスタンスを計算画面へ追加する。追加したデータセットのインスタンスのNameプロパティを「calcFormDs1」から「calcFormDs」に変更する。

図3.4-6 画面データセットの追加

#### 3.2 画面項目と画面データセットのバインド

計算画面の画面項目と画面データセットをバインドする。

表3.4.1-5 画面項目と画面データセットの対応一覧

画面項目名 | コントロール種別 | DataTable名 | Column(列)名
|  | CalcTable |
数値A | テキストボックス |  | NumberA
数値B | テキストボックス |  | NumberB
解 | テキストボックス |  | Answer

図3.4-7 数値Aのテキストボックスと、データセットのNumberAカラムをバインドした例

#### 3.3 画面データセットの初期化

計算画面クラスのLoadイベントに、画面データセットの行を追加するロジックを実装する。

CalcForm.cs

    /// <summary>
    /// フォームロード時に実行されるイベントハンドラです。
    /// </summary>
    /// <remarks>
    /// 画面データセットを初期化します。
    /// </remarks>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している <see cref="EventArgs"/> 。</param>
    private void CalcForm_Load(object sender, EventArgs e)
    {
        calcFormDs.CalcTable.AddCalcTableRow(
            calcFormDs.CalcTable.NewCalcTableRow());
    }

### 4. データセット変換設定ファイルの設定

データセット変換設定ファイル（ConversionConfiguration.config）に、画面データセットとビジネスロジック入出力データセットの変換仕様を定義する。コンバートIDは"calc"を、param要素にはサーバに送信する画面データセットのカラム（NumberAおよびNumberB）を、result要素にはサーバから受信した値を反映する画面データセットのカラム（Answer）を記述する。データセット変換設定ファイルの設定に関する詳細は、機能説明書『FB-02 データセット変換機能』を参照のこと。

ConversionConfiguration.config

    <?xml version="1.0" encoding="utf-8" ?>
    <!-- データセット変換設定ファイル -->
    <conversionConfiguration xmlns="http://www.terasoluna.jp/schema/ConversionSchema.xsd">

      <convert id="logon">
        <param>
          <column src="LogonTable.Id" />
          <column src="LogonTable.Pass" />
        </param>
        <result>
        </result>
      </convert>

      <convert id="calc">
        <param>
          <column src="CalcTable.NumberA"/>
          <column src="CalcTable.NumberB"/>
        </param>
        <result>
          <column src="CalcTable.Answer"/>
        </result>
      </convert>

    </conversionConfiguration>

### 5. ビジネスロジック設定ファイルの設定

ビジネスロジック設定ファイル（BLogicConfiguration.config）に、XML通信を実行するビジネスロジックを定義する。 ビジネスロジックのname属性には"communicateBLogic"を、type属性にはServer Frameworkが提供するXML通信用ビジネスロジッククラス（DataSetXmlCommunicateBLogic）のアセンブリ修飾名を記述する。ビジネスロジック設定ファイルの設定に関する詳細は『CM-04 ビジネスロジック生成機能』を参照のこと。

BLogicConfiguration.config

    <?xml version="1.0" encoding="utf-8"?>
    <!-- ビジネスロジック設定ファイル -->
    <blogicConfiguration xmlns="http://www.terasoluna.jp/schema/BLogicSchema.xsd">

      <!-- ユーザー定義ビジネスロジック -->
      <blogic name="logonBLogic" type="TutorialClient.BLogic.LogonBLogic, TutorialClient" />

      <!-- XML通信を行うビジネスロジック -->
      <blogic name="communicateBLogic" type="TERASOLUNA.Fw.Client.BLogic.DataSetXmlCommunicateBLogic`1, TERASOLUNA.Fw.Client" />

    </blogicConfiguration>

### 6. EventControllerコンポーネントのインスタンスの追加

ツールボックスからEventControllerのインスタンスを画面に追加する。

図3.4-8 EventControllerコンポーネント

### 7. EventControllerコンポーネントのプロパティの設定

計算画面に追加したEventControllerインスタンスのプロパティを設定する。BLogicNameプロパティに5. ビジネスロジック設定ファイルの設定 で設定した"communicateBLogic"を指定することで、XML通信を行うことができる。

図3.4.1-9 calcEventのプロパティの設定例

表3.4.1-6 calcEventのプロパティの設定例

プロパティ名 | 設定値 | 備考
Name | calcEvent | インスタンスの名前。
ConvertId | calc | データセット変換設定ファイルに定義されたコンバートIDを指定する。
BLogicName | communicateBLogic | 5. ビジネスロジック設定ファイルの設定 でビジネスロジック設定ファイルに設定された、サーバとXML通信を行うビジネスロジック名"communicateBLogic"を設定する。
RequestName | calc | サーバで実行するビジネスロジックを特定するためのリクエスト名。
ErrorHandler | CalcForm | IErrorHandler実装クラスのインスタンス。
ViewData | calcFormDs | 画面データセットのインスタンス。

### 8. EventControllerコンポーネントの実行

計算画面(CalcForm.cs)の計算ボタンのクリックイベントに、6. EventControllerコンポーネントのインスタンスの追加 で画面に追加したEventControllerを実行するロジックを実装する。

CalcForm.cs

    /// <summary>
    /// 計算ボタン押下時に実行されるイベントハンドラです。
    /// </summary>
    /// <remarks>
    /// 掛け算の処理を実行します。
    /// </remarks>
    /// <param name="sender">イベントのソース。</param>
    /// <param name="e">イベントデータを格納している <see cref="EventArgs"/> 。</param>

    private void calcButton_Click(object sender, EventArgs e)
    {
        ExecutionResult result = calcEvent.Execute();

        if (result.Errors.Count != 0)
        {
            string message = result.Errors[0].Message;
            MessageBox.Show(message);
        }
    }

計算ボタンのクリックイベントでは、EventControllerのExecuteメソッドを実行する。計算ボタンのクリックイベントで業務エラーが発生した場合、エラーメッセージが出力される。

##### 備考

ここでは業務エラーをExecutionResult.Errorsプロパティにエラーメッセージが設定されているかどうかで判定しているが、EventControllerのBLogicFailedイベントなど各種エラーイベントを使用して実装することもできる。詳細は、機能説明書『FB-01 イベント処理機能』を参照のこと。

## 動作確認

1. 通信先URLの確認を行う。

通信先URLがアプリケーション構成ファイル(App.config)に指定されていることを確認する。アプリケーション構成ファイルのadd要素のkey属性に「BaseUrl」、value属性に「http://localhost/TutorialServerRich/Request.aspx」と設定されていることを確認する。

App.config

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>

    　・・・ 省略 ・・・

      <appSettings>
        <!-- 通信先URL設定 -->
        <add key="BaseUrl" value="http://localhost/TutorialServerRich/Request.aspx"/>
      </appSettings>

    </configuration>

2. クライアントアプリケーションを起動する(デバッグ⇒デバッグなしで開始)。
3. ユーザID "tera"、パスワード "soluna" と入力し、ログオンボタンを押下する。

図3.4-11 ログオン画面⇒メニュー画面

4. 計算画面ボタンを押下する。

図3.4-12 メニュー画面⇒計算画面

5. 数値A "12"、数値B "2" を入力後、計算ボタンを押下し、解に掛け算結果"24"が表示されることを確認する。

図3.4-13 計算画面(計算前)⇒計算画面(計算後)

次節：3.4.2 ファイルアップロード通信