Skip To Content

エクステンションのコーディング プラクティス

マップ サービスまたはイメージ サービス (SOE または SOI) を拡張するには、一般に、必要なインターフェイスを実装し、ビジネス ロジックを実行するコードを記述します。 Java を使用している場合は、Eclipse プラグインのウィザードを使用してエクステンションの作成を開始できます。 .NET を使用している場合は、Visual Studio のテンプレート プロジェクトを使用して作成を開始します。 ウィザードとテンプレートを使用することで、エクステンションに必要なインターフェイスが実装され、REST または SOAP Web サービスの呼び出しに SOESupport のクラスを使用して応答できることが保証されます。

エクステンションのコーディング手順の詳細については、使用している SDK のドキュメントをご参照ください。 Windows 上で C++ を使用してエクステンションを作成することもできます。また、サンプルが ArcObjects SDK for C++ に収録されています。

適切なクラスおよびインターフェイス

SOE と SOI の開発時に使用が許可されているクラスとインターフェイスは、使用している SDK によって異なります。

ArcObjects SDK (.NET および Java)

エクステンションは、ダイナミック (キャッシュされていない) マップ サービスとイメージ サービスでのみサポートされています。 マップ サービスとイメージ サービスは、サービス定義ファイルを使用し、マップ ドキュメント (MXD) に直接アクセスしないため、エクステンションを記述するときに避ける必要があったり、使用を推奨される特定のクラスがあります。

MXD で使用するように特に設計されている Carto ライブラリの ArcObjects の使用を避けてください。 これには、IMap、ILayer、およびデータ フレームやページ レイアウトに関連するアイテムがあります。 代わりに、MapServer、MapLayerInfos、および MapDescription など、マップ サービスの操作用に設計されている ArcObjects を使用します。 マップの各レイヤーの基盤となるデータセットにアクセスするには、インターフェイス IMapServerDataAccess を使用します。

ESRI.ArcGIS.Geometry および ESRI.ArcGIS.Geodatabase for .NET や com.esri.arcgis.geometry および com.esri.arcgis.geodatabase for Java など、マップ ドキュメントに直接関連していないライブラリは、エクステンションで常に使用できます。

ArcGIS Enterprise SDK

ArcGIS Enterprise SDK を使用して、マップ サービスを拡張する SOE (サーバー オブジェクト エクステンション) を開発したり、マップおよびイメージ サービス (フィーチャ サービスや OGC 互換サービスなどのサービス エクステンションを含む) の機能をカスタマイズする SOI (サーバー オブジェクト インターセプター) を開発したりすることができます。

ArcGIS Enterprise SDK は、カスタム エクステンションの開発を容易にするためのライブラリのコア セットに付属しています。 この SDK で利用できるクラスとインターフェイスはすべて、エクステンションで使用するように設計され、使用が許可されています。

サーバー オブジェクト インターセプター (SOI) の考慮事項

サーバー オブジェクト インターセプター (SOI) を作成する場合、SOI の目的が、マップおよびイメージ サービスで利用できる多くの操作のうち 1 つまたは少数の操作だけを強化することであっても、すべてのタイプの受信リクエストを処理する必要があります。 このセクションでは、処理する必要のあるインターフェイスと利用可能な方法について説明します。これらは、実装する機能が、セキュリティに関連しているか、セキュリティ以外に関連しているかによって異なります。

REST、SOAP、および OGC サービス リクエストのインターセプト

マップおよびイメージ サービスは、次の 3 種類のリクエストをサポートしています。

  • REST API リクエスト
  • SOAP API リクエスト
  • OGC リクエスト

SOI でこれらのリクエストをインターセプトできるようにするには、次のインターフェイスを実装する必要があります。

  • IRESTRequestHandler - REST API リクエストを処理する場合
  • [IRequestHandler2] (ArcObjects SDK) または [IRequestHandler] (ArcGIS Enterprise SDK) - ArcMap や ArcGIS Pro などが送信するリクエストを含む SOAP API リクエストを処理する場合
  • [IWebRequestHandler] - OGC リクエストを処理します

特定のサービス構成が OGC リクエストをサポートしていない場合でも、上記すべてのインターフェイスを処理する必要があります。 実装しているビジネス ロジックに応じて、2 つの一般的な方法があります。

メモ:

マップまたはイメージ サービスにキャッシュ タイルが含まれていない場合、これらのタイルに対して実行されたリクエストをインターセプトできません。

セキュリティ機能を実行する SOI を実装する場合は、はじめに上記のインターフェイスをすべて実装し、すべてのリクエストをブロックすることをお勧めします。 カスタム コードを実装するため、上記インターフェイスを使用してアクセスを論理的に許可することができます。 最初に受信リクエストをブロックせずに、希望するアクセスを許可した場合、意図せずにセキュリティの脆弱性にさらされるリスクが高まります。

セキュリティ機能を実装しない場合、通常の機能を許可するために、基盤となる標準的な実装にすべてのリクエストを渡すことで、3 つのインターフェイスを実装することができます。 次に、強化する操作にその他のビジネス ロジックを追加します。

サービスを SOI で構成すると、サーバー ワークフローは、すべてのサービス リクエストを SOI にルーティングします。 SOI の役割は、リクエストをフィルタリングし、リクエストをマップまたはイメージ サービス オブジェクト (該当する場合) に委任し、必要に応じて、応答をクライアントに返す前に処理することです。

レイヤー レベルのアクセスの制御の実装

また、SOI を使用してレイヤー レベルのアクセス制御を実装する場合は、サービスに含まれるすべてのレイヤー リソースのキャッシュを無効化するように ArcGIS Server の REST ハンドラーを構成する必要があります。 これにより、操作をインターセプトして、許可されないレイヤーを除外することができます。 これを無効化するには、ArcGIS Server Administrator Directory で、サービスの disableCaching プロパティを true に設定します。

  1. ArcGIS Server Administrator Directory を開いてサイン インします。 多くの場合、URL の形式は https://gisserver.domain.com:6443/arcgis/admin です。
  2. [services] をクリックして、必要なサービスの名前をクリックします。 リスト内にサービスが表示されていない場合は、このディレクトリのフォルダー内にあります。
  3. [edit] をクリックします。
  4. サービス JSON の properties セクションで、disableCaching プロパティを追加して、その値を true に設定します。たとえば、次のようになります。
    "properties": {
      ...
      "disableCaching": "true",
      ...
     },
  5. [Save Edits] をクリックします。

.soe ファイルの作成

エクステンション (SOE または SOI) は .soe ファイルにカプセル化されます。 .soe ファイルには、エクステンションを ArcGIS Server に登録するために必要なすべての情報が含まれています。 .NET を使用している場合、.soe ファイルはテンプレートからプロジェクトを構築したときに作成されます。 Java を使用する場合、Eclipse に組み込まれているウィザードを使用して、.soe ファイルを作成します。 .soe ファイルは、手動で実行したり、自動的に作成されるスクリプトに統合したりできる Esri のコマンドライン ユーティリティを使用して作成することもできます。

ArcGIS Enterprise SDK を使用して開発されたエクステンションには、接尾辞 _ent がその .soe ファイル名に追加されています。 たとえば、[SimpleRESTSOE] という名前のエクステンションの出力ファイル名は SimpleRESTSOE_ent.soe になります。