リモート可能オブジェクトの使い方
Web サービスの利用:インデックス への移動
TRemotable は、起動可能インターフェイス上で複合データ型を表すクラスを定義するときの基底クラスとして使用します。 たとえば、通常であればパラメータとしてレコードや構造体を渡す状況で、TRemotable の下位クラスを定義します。 この場合、新しいクラスではレコードや構造体のすべてのメンバがパブリッシュ プロパティになります。
次の項目の使用は推奨されていません。 |
---|
TRemotable の下位のパブリッシュ プロパティがその型の対応する SOAP エンコード内の要素ノードまたは属性のいずれとして表示されるかは、制御できます。 このプロパティを属性にするには、プロパティ定義上で stored 指令を使用して、AS_ATTRIBUTE を値として割り当てます。 property MyAttribute: Boolean read FMyAttribute write FMyAttribute stored AS_ATTRIBUTE;
__property bool MyAttribute = {read=FMyAttribute, write=FMyAttribute, stored= AS_ATTRIBUTE;
stored 指令を含めない場合、または stored 指令にその他の値を割り当てる場合(関数が AS_ATTRIBUTE を返す場合でも)、このプロパティは属性ではなくノードとしてエンコードされます。 |
AS_ATTRIBUTE 機能は、使用することは推奨されません。 この機能は従来のコードのためにまだ有効ですが、プロパティの索引値を使用する方法をお勧めします。 索引プロパティでは、ユーザーは、プロパティが属性、バインドされていない要素、オプション要素、テキスト値であるか、値に NULL をもつことができるか指定できます。 オプション要素のサポートは、格納されたプロパティ属性によって決まります。 この属性は、プロパティが指定されている場合に、TRUE を返し、指定されていない場合に、FALSE を返すメソッドを指しています。
次の例では、オプション属性とテキスト要素のサポートを示します。
type
{ これは、システムがサポートする言語を格納する }
Thumbnail = class(TRemotable)
private
FText: WideString;
FExists: WideString;
FExists_Specified : boolean;
procedure SetExists(Index: Integer; _prop_val: WideString);
function Exists_Specified(Index: Integer): boolean;
published
property Text: WideString index IS_TEXT read FText write FText;
property Exists: WideString index IS_ATTR or IS_OPEN read FExists write SetExists stored Exists_Specified;
end;
implementation
procedure Thumbnail.SetExists(Index: Integer; _prop_val: WideString);
begin
FExists := _prop_val;
FExists_Specified := true;
end;
function Thumbnail.Exists_Specified(Index: Integer): boolean;
begin
Result := FExists_Specified;
end;
end.
class Thumbnail : public TRemotable {
private:
WideString FText;
WideString FExists;
bool FExists_Specified;
void __fastcall SetExists(int Index, WideString _prop_val)
{ FExists = _prop_val; FExists_Specified = true; }
bool __fastcall Exists_Specified(int Index)
{ return FExists_Specified; }
__published:
__property WideString Text = { index=(IS_TEXT), read=FText, write=FText };
__property WideString Exists = { index=(IS_ATTR|IS_OPTN), read=FExists, write=SetExists, stored = Exists_Specified };
};
新しい TRemotable の下位の値が WSDL ドキュメント内のスカラ型を表す場合は、代わりの基底クラスとして TRemotableXS を使用する必要があります。 TRemotableXS は、TRemotable の下位クラスで、新しいクラスとその文字列表現の間で変換を行うメソッドを 2 つ導入します。 これらのメソッドを実装するには、XSToNative および NativeToXS メソッドをオーバーライドします。
よく使用される特定の XML スカラ型用に、XSBuiltIns ユニットは既にリモート可能クラスを定義および登録しています。 これらを次の表に示します。
リモート可能クラス :
XML 型 | リモート可能クラス |
---|---|
dateTime timeInstant |
|
date |
|
time |
|
durationtimeDuration |
|
decimal |
|
hexBinary |
|
string |
|
boolean |
|
integer |
|
long |
メモ: string、boolean、integer または long 値が nil(C++ の場合、NULL または 0)になる可能性がある場合は、それぞれ TXSString、TXSBoolean、TXSInteger と TXSLong を使用できます。 データの送受信が指定されていないときは、TXMLData 型を使用できます。 TXMLData は、SOAP メッセージで XML そのまま(スキーマなど)の受け渡しに使用できます。
リモート可能クラスを定義したら、「非スカラ型の登録」の説明に従って、このクラスをリモート可能型レジストリに登録する必要があります。 サーバーでは、このクラスを使用するインターフェイスを登録したときにこの登録は自動的に行われます。 クライアントでは、型を定義する WSDL ドキュメントをインポートしたときに、このクラスを登録するコードが自動的に生成されます。 リモート可能クラスの定義と登録の例は、「リモート可能オブジェクトの例」を参照してください。
ヒント: TRemotable の下位を実装および登録するユニットは、サーバー アプリケーションのその他の部分(起動可能インターフェイスを宣言および登録するユニットなど)から分けることをお勧めします。 分けると、複数のインターフェイスに対してその型を使用できます。
添付ファイルの表記
TRemotable の重要な下位の 1 つが TSoapAttachment です。 このクラスは添付ファイルを表します。 このクラスは添付ファイルを表します。 TSoapAttachment は、起動可能インターフェイスにあるメソッドのパラメータ値や戻り値として使用できます。 添付ファイルは、SOAP メッセージとともにマルチパート フォームの別個の部分として送信されます。
Web サービス アプリケーションまたは Web サービスのクライアントで受信された添付ファイルは、一時ファイルに書き込まれます。 一時ファイルにアクセスするか、一時ファイルの内容をストリームや通常のファイルに保存するとき、TSoapAttachment を使用します。 アプリケーションで添付ファイルの送信が必要な場合、アプリケーションは TSoapAttachment のインスタンスを作成し、ファイル名を指定してその内容を割り当てます。 これにより、添付ファイルを読み取るストリーム、または添付ファイルの内容を示す文字列が提供されます。
リモート可能オブジェクトの存続期間の管理
TRemotable の下位を使用するときの問題の 1 つは、作成および破棄する時期です。 明らかに、サーバー アプリケーションはこれらのオブジェクトのローカル インスタンスを独自に作成しなければなりません。 呼び出し元のインスタンスが別個のプロセス空間内にあるからです。 これに対処するために、Web サービス アプリケーションは、受信した要求に対してデータ コンテキストを作成します。 このデータ コンテキストは、サーバーがその要求を処理する間は保持され、出力パラメータが戻りメッセージ内にマーシャリングされた後に解放されます。 サーバーは、リモート可能オブジェクトのローカル インスタンスを作成すると、これをデータ コンテキストに追加し、このインスタンスはデータ コンテキストとともに解放されます。
メソッド呼び出しの後もリモート可能オブジェクトのインスタンスが解放されないようにする場合もあります。 たとえば、オブジェクトがステート情報を含む場合は、すべてのメッセージ呼び出しに対して使用される単一のインスタンスがある方がより効率的です。 データ コンテキストとともにリモート可能オブジェクトが解放されないようにするには、DataContext プロパティを変更します。