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