您可以使用可在 ArcGIS 客户端执行的自定义逻辑来扩展 ArcGIS Server 地图和影像服务(包括地图和影像服务扩展模块,如要素服务)。可使用两种方法扩展这些服务类型:
- 服务器对象扩展模块 (SOE) - 可用于创建新的服务操作,以扩展地图或影像服务基本功能。如果您要执行的明确定义的业务逻辑很难利用 ArcGIS 客户端 API 来实现,这时就可以选择使用 SOE。大多数 SOE 是通过将 ArcObjects 代码与 GIS 数据和地图结合使用来实现此目标的。ArcObjects 是构建 ArcGIS 的核心组件,通过 ArcObjects 编写 GIS 功能可以提供最大的灵活性。
- 服务器对象拦截器 (SOI) - 可用于拦截地图或影像服务的现有内置操作请求。这使您可以执行自定义逻辑,并可针对现有客户端无缝覆盖现有操作,从而更改这些服务行为。上述客户端可以是使用 ArcGIS API for Javascript 和 ArcGIS Runtime SDK 等构建的应用程序。
以下部分进一步详细介绍了各个类型。
服务器对象扩展模块 (SOE)
SOE 适用于创建新的服务操作,以扩展地图或影像服务的基本功能 (包括地图和影像服务扩展模块,如要素服务)。SOE 具有以下优势:
- 可将 SOE 以表述性状态转移 (REST) 和/或简单对象访问协议 (SOAP) web 服务的形式进行暴露,从而使构建于 ArcGIS 客户端 API 和任何其他 REST 或 SOAP 客户端上的自定义客户端能够方便地对其进行调用。事实上,REST SOE 会显示在 ArcGIS 服务目录中并可暴露出 ArcGIS 客户端 API 能够识别的典型对象类型(大多数采用 JSON 格式)。
- 构建 SOE 时,您只是提供在 ArcGIS Server 上进行工作的大致方法,而不是从客户端对服务器进行大量的调用。SOE 可非常有效地封装 ArcObjects 逻辑,从而为您快速执行调用提供了理想的环境。
如果要提供无法通过其他方式获得的 ArcObjects 功能或需要提供可快速执行的 ArcObjects 功能,您可能需要开发 SOE。SOE 适用于经验丰富的开发人员并需要了解多种开发平台的知识。ArcObjects SDK for Java 和 Microsoft .NET Framework 中包含多个 SOE 示例以供查看。
是否需要 SOE?
SOE 需要 web 开发、ArcObjects,以及编程语言(如 Java 或 基于 .NET 的语言,如 C#)相关的知识。它们还必须进行部署以供服务器使用。在开发服务器对象扩展之前,您不妨考虑一些更容易的替代方案。
开发 SOE 最容易的替代方案,可能就是创建实现业务逻辑的地理处理模型,然后将该模型作为服务进行发布。可使用模型构建器以交互方式对需要的工具进行拖放和连接,而无需编写 ArcObjects 代码。地理处理服务同样支持异步执行功能,这样您可以开始作业、执行其他操作并随后返回来检查结果。
地理处理服务的缺点是占用的内存较大并且运行速度可能比 SOE 慢。如果您一天只运行某个流程几次,那么这不是什么问题。然而,如果一天要运行某个流程很多次,或者有许多并发用户,则花些时间来构建 SOE 是值得的。
以前许多开发人员针对不同任务编写 ArcObjects 代码,而现在无需 ArcObjects 便可实现这些任务。有关使用 ArcObjects 以外的其他方法来执行 Web 制图的详细讨论,请参阅服务器对象扩展的替代方法。
服务器对象拦截器 (SOI)
SOI 适用于更改现有地图或影像服务操作行为(包括地图和影像服务扩展模块,如要素服务操作)。例如,您可以更改查询或地图影像导出请求行为。SOI 的功能示例包括:
- 将水印添加到所有地图影像
- 提供图层级别安全性
- 允许或禁止用户角色访问特定操作
是否需要 SOI?
SOE 需要 web 开发、ArcObjects 以及编程语言(如 Java 或 基于 .NET 的语言,如 C#)相关的知识。它们还必须进行部署以供服务器使用。在您开发服务器对象拦截器之前,需考虑是否需要该功能。
如果您想扩展服务器的新功能,可考虑使用 SOE 或地理处理模型和脚本。SOI 可通过公开于现有客户端应用程序的方式在现有 ArcGIS Server 操作上添加新功能或行为。
如果要使用一系列扩展模块来完成一个或多个任务,可以使用 SOI。可以将一个或多个服务上的多个 SOI 链接在一起。可随时修改 SOI 列表以及 SOI 在链中的执行顺序。
您可以通过创建一个或多个 SOI 来实施自定义业务逻辑(如安全性),或对默认地图或影像服务不符合的要求进行审核。例如:
- 在服务器创建的所有地图影像上加水印 - 可通过创建一系列 SOI 向服务器创建的地图影像上叠加自定义水印。该功能可让组织或托管公司确保所有影像上均正确添加了标识。
- 审核并记录所有请求 - 出于调试目的,您可创建一系列 SOI 以记录收到请求的详细信息,如有关输入参数和该请求传递的用户凭据的完整信息。
- 后处理响应 - 可向发出的响应添加来自不受 ArcGIS Server 支持的单独业务系统的其他信息,以便将空间数据与其他 business intelligence 数据进行连接。
- 地图服务操作级别的访问控制 - ArcGIS Server 仅支持向所有服务用户提供启用服务操作或完全禁用访问操作。一系列 SOI 可基于用户角色对收到的请求进行过滤,以实现服务操作级别的访问。
- 地图服务图层级别的访问控制 - 无论用户是具有对所有服务数据的完全访问权限,还是不具访问权限,ArcGIS Server 都仅提供服务级别的数据访问。一系列 SOI 可用于对特定图层的访问进行过滤,还可以根据用户角色对图层内的数据进行过滤。
开发扩展模块须知
开发扩展模块需要您具备通过 Java 或 .NET 编程语言调用 ArcObjects 的知识。同时还需要了解 REST 或 SOAP 原理。使用 Java 开发的扩展模块可以部署至 ArcGIS for Server (Windows) 和 ArcGIS for Server (Linux)。使用 .NET 开发的扩展模块仅可部署至 ArcGIS for Server (Windows)。
只能针对特定的服务类型(地图服务或影像服务)开发扩展模块。例如,无法开发既适用于地图服务,又适用于影像服务的通用扩展模块。在这种情况下,必须为每种服务类型开发单个扩展模块;即为地图服务和影像服务各开发一个扩展模块。
另外,如果要为扩展模块编写自动生成属性页面之外的自定义属性页面,您必须了解 Windows 窗体开发或 Java Swing(针对 ArcCatalog 页面)或使用超文本标记语言 (HTML) 和 JavaScript 进行 Web 窗体开发(针对 Manager 页面)的知识。