Skip To Content

通过编码方式进行扩展

要扩展地图或影像服务(SOE 或 SOI),通常需要编写实现一些所需接口和执行业务逻辑的代码。可以使用 Eclipse 插件向导着手创建扩展模块。向导可确保您的扩展模块实现所需的接口,且可对使用 SOESupport 中类的 REST 或 SOAP Web 服务调用做出响应。

ArcObjects SDK 中提供了编码扩展模块的详细说明。

适合的 ArcOjects 类和接口

仅地图和影像服务支持扩展模块。因为地图和影像服务使用服务定义文件并且不直接访问地图文档 (MXD),因此编写扩展模块时应避免使用某些类而优先使用其他类。

避免使用 Carto 库中专门为配合 MXD 使用而设计的 ArcObjects。包括 IMap、ILayer 以及与数据框和页面布局有关的项目。改用旨在用于地图服务的 ArcObjects,如 MapServer、MapLayerInfos 和 MapDescription。使用 IMapServerDataAccess 接口访问地图中各图层的基础数据集。

不直接与地图文档(例如 com.esri.arcgis.geometrycom.esri.arcgis.geodatabase)相关的库可一直在扩展模块中使用。

服务器对象拦截器注意事项

在创建服务器对象拦截器 (SOI) 时,即使 SOI 仅用于增强可与地图和影像服务一起使用的众多操作中的一个或多个操作,也必须处理所有类型的收到的请求。本部分详细将介绍您需要处理的接口,以及您可使用的方法,具体视您要实现的是安全相关的功能,还是非安全相关的功能而定。

拦截 REST、SOAP 和 OGC 服务请求

地图和影像服务支持三种不同类型的请求:

  • REST API 请求
  • SOAP API 请求
  • OGC 请求

为了使 SOI 拦截这些请求,需要实现以下接口:

  • IRESTRequestHandler - 用于处理 REST API 请求
  • IRequestHandler2 - 用于处理 ArcGIS for Desktop 客户端(例如 ArcMap)提出的 SOAP API 请求
  • IWebRequestHandler - 用于处理 OGC 请求

即使某个特定服务配置不支持 OGC 请求,也需要处理所有上述接口。根据您要实现的业务逻辑,您可采取两种常规方法。

如果您要实现将会执行安全功能的 SOI,则建议您首先实现所有上述接口并阻止所有请求。在实现自定义代码时,可在逻辑上允许通过上述接口进行访问。如果最初没有阻止收到的请求,并随后根据需要允许进行访问,则无意中出现安全漏洞的风险会大大增加。

如果没有实现安全功能,则可通过将所有请求传递到基础标准实施来实现三个接口,从而允许正常运行。然后,将其他业务逻辑添加至所要增强的一或多个操作中。

如果服务配置了 SOI,则服务器框架会将所有服务请求发送到 SOI。SOI 负责过滤请求、将请求委托给实际的地图或影像服务对象(如果适用),然后可选择在将请求返回至客户端之前进一步处理响应。

实现图层级别的访问控制

如果通过 SOI 实现图层级别的访问控制,还需要配置 ArcGIS Server 的 REST 处理程序以禁用缓存所有包含此服务的图层资源。这将允许您拦截操作并过滤不允许访问的图层。可通过在 ArcGIS Server 管理员目录中将服务的 disableCaching 属性设置为 true 来将其禁用。

  1. 打开 ArcGIS Server 管理员目录并登录。URL 的格式通常是 http://gisserver.domain.com:6080/arcgis/admin
  2. 单击服务,然后单击所需服务的名称。如果列表中未显示该服务,则其可能位于此目录下的某个文件夹内。
  3. 单击编辑
  4. 在服务 JSON 的 properties 部分中,添加 disableCaching 属性并将其值设置为 true,例如:
    "properties": {
      ...
      "disableCaching": "true",
      ...
     },
  5. 单击保存编辑

创建一个 .soe 文件

扩展模块(SOE 或 SOI)将被封装在 .soe 文件中。该 .soe 文件包含将扩展模块注册到 ArcGIS Server 时所必需的所有信息。您使用 Eclipse 内置的向导创建 .soe 文件。 此外,还可使用 Esri 提供的命令行实用程序创建 .soe 文件,而该实用程序可以手动运行,也可集成到自动构建脚本中。