Skip to main content

 

 

 

 
Language:
 
 
 
OutSystems

.NETアセンブリからWebサービスをインポートする

幅広いWebサービスに対応するために、Integration StudioではWebサービスクライアントの定義をインポートできます。OutSystemsでは、これを「Web参照」と呼びます。Web参照はエクステンションにカプセル化してService Studioで使用することができます。

Service Studioでの利用方法の詳細については、「SOAP Webサービスを利用する」をご覧ください。

Visual Studioを使用して.NETアセンブリプロキシを作成する

以下の手順を実行します。

  1. WSDLアドレスを取得します。

  2. 新しいVisual C# Class Libraryプロジェクトを作成し、.NETフレームワーク3.5以降に設定します。

  3. Solution Explorerで新しいプロジェクトを右クリックし、[Add Service Reference...]を選択します。

  4. Add Service Reference]ウィンドウで、[Advanced...]ボタンをクリックした後、[Add Web Reference...]をクリックします。

  5. WebサービスのWSDLアドレスを[URL]フィールドに入力します。

  6. Visual StudioがWebサービスによって公開されているメソッドを検出した後、[Add Reference]を押します。

  7. F6を押すか、プロジェクトを右クリックして[Build]を選択し、プロジェクトを作成します。

コマンドラインを使用して.NETアセンブリプロキシを作成する

Visual Studioで生成できるのは一度に1つのプロキシのみです。同じストラクチャ(同一のデータ型)を使用する複数のサービスをインポートする必要がある場合は、「Employee1」、「Employee2」、「Employee3」のように同じストラクチャに複数の表現が存在することになります。

.NET Framework SDKで入手可能なDisco.exeWsdl.exeツールを使用すると、この問題を解決できます。

  1. Visual Studio ToolsフォルダからVisual Studio Command Promptを起動します。

  2. disco.exe <first_wsdl_path>を実行してresults.discomapファイルを生成します。

  3. ファイル名を「wsdl1.discomap」に変更します。エンドポイントが同一のWebサービスが2つある場合、生成されたファイルを別々のフォルダに保存する必要があります。そうしない場合、最初のWebサービス用に生成されたファイルは次の手順で削除されます。

  4. disco.exe <second_wsdl_path>を実行します。生成されたファイル名を「wsdl2.discomap」に再度変更します。

  5. wsdl.exe /shareTypes /out:proxy.cs wsdl1.discomap wsdl2.discomapを実行し、C# プロキシを生成します。

  6. csc.exe /target:library proxy.csを実行し、プロキシをDLLにコンパイルします。必ず.NET Framework 3.5以降のC# コンパイラを使用します。

.NETアセンブリをインポートする

  1. Integration Studioで、[File > Import]をクリックします。

  2. Import Actions from .NET Assembly...]を選択して、先ほど作成したDLLをインポートします。詳細については、「.NETアセンブリからアクションをインポートする」をご覧ください。

    Integration StudioはDLLのイントロスペクションを行い、インポートするWebサービスメソッドを選択するよう求めます。

  3. 最後に、インポートするメソッドを選択します。

ウィザードの終了後、Integration StudioはService Studioアクションとストラクチャを生成します。これで他のエクステンション内と同様に、どのようなカスタムロジックでも開発できます。

Webサービスを利用する

インポートを行うと、複数のコンストラクタ(<Structure_Name>_New)が自動で作成されます。ご注意ください。これらのコンストラクタを使用して、Webサービスを起動する際のストラクチャをインスタンス化します。

他のエクステンションと同様に、[1-Click Publish]をクリックしてサーバーにエクステンションをパブリッシュします。操作が終了すると、Webサービスをカプセル化したエクステンションを、依存関係としてすべてのモジュールで使用できるようになります。

Web参照の定義が変更された場合、新しいWeb参照をカプセル化するための新しいエクステンションを作成し、すべてのモジュールがこの新しいエクステンションを参照するよう設定する必要があります。

サポートされているWebサービス構成

OutSystems言語の表現力が原因で、Service Studioでは直接サポートされていないものの、Webサービスのクライアント定義の.NETアセンブリをインポートすることによってサポートされる構成があります。

  • データ型で継承を使用するWebサービス
  • 再帰データ型のWebサービス
  • 多次元配列のWebサービス

生成されるストラクチャ

例として、以下のクラスを検討します。

.NETアセンブリのイントロスペクション中、Integration Studioは基本クラスと同名の単一のストラクチャを作成します。Typeアトリビュートは、インスタンス化されたストラクチャがどのクラスを示しているかを指定します。

継承チェーン内のすべてのクラスのフィールドがアトリビュートとしてLifeストラクチャに存在しており、フィールドの説明には所属クラスが示しています。ストラクチャを同一にして継承全体を表すより、提供されるコンストラクタを使用するほうが、希望するクラスを容易にインスタンス化できます。

再帰データ型を使用する

再帰データ型を使用する際、Integration Studioは再帰を引き起こす要素をシリアル化します。

上記の例では、AnimalクラスはLifeクラスを拡張するので再帰ですが、同時にLifeデータ型の[FavoriteFood]フィールドを含んでいます。この場合、[FavoriteFood]フィールドはこの再帰定義を回避するためにシリアル化されます。そのため、インポートされたAnimalクラスは、LifeからSerializedLifeに変更されたFavoriteFoodデータ型になります。

ストラクチャの作成を支援するために、Integration Studioは各ストラクチャにコンストラクタアクションを提供しています。コンストラクタはパラメータとしてクラスのすべてのフィールドを受け取り、再帰を引き起こすフィールドを内部で変換してデータ型を修正します。このため、ボトムアップでのストラクチャ作成にはコンストラクタを使用し、作成プロセスでのシリアル化対処を回避する必要があります。

例として、「ニワトリ」というオブジェクトをインスタンス化する場合、以下の手順を実行します。

  1. Vegetable_Newコンストラクタアクションを使用して、とうもろこし(ニワトリの好きな食べ物)のストラクチャのインスタンスを作成します。これはNameSizeWeightHasFruitパラメータを受け取ります。

  2. コンストラクタ(Animal_New)を使用して、ニワトリのストラクチャをインスタンス化します。これはNameSizeWeightSpeedFavoriteFoodパラメータを受け取ります。

  3. Animal_NewアクションのFavoriteFood引数として、Vegetable_Newの結果を渡します。

ニワトリのオブジェクトの作成後にそのFavoriteFoodにアクセスする必要がある場合、SerializedLifeデータ型であるため、提供されているDeserializeアクションを使用します。Life_Deserializeを呼び出し、パラメータとしてニワトリのアトリビュートであるFavoriteFoodを渡します。このアクションはこれをSerializedLifeからLifeに変換するため、値を読み込むことができます。

同様に、直接FavoriteFoodを指定してそのアトリビュートを変更する場合、以下の手順を実行します。

  1. Life_Deserializeアクションを使用して、FavoriteFoodSerializedLifeからLifeデータ型に変換します。

  2. 必要に応じて、FavoriteFoodを変更します。

  3. Life_Serializeアクションを使用して、FavoriteFoodをシリアル化します。これでFavoriteFoodLifeからSerializedLifeに戻ります。

  4. ニワトリのFavoriteFoodアトリビュートにシリアル化されたバージョンを割り当てます。

  • Was this article helpful?