要扩展地图或影像服务(SOE 或 SOI),通常需要编写实现一些所需接口和执行业务逻辑的代码。 如果使用的是 Java,您可使用 Maven archetype 中的 SOE 或 SOI 开始创建扩展模块。 如果要使用 .NET,那么将从具有模板项目的 Visual Studio 开始。 模板可确保您的扩展模块实现所需的接口,且可对使用 SOESupport 中类的 REST 或 SOAP Web 服务调用做出响应。
有关编码扩展模块的详细说明,您可以参阅 ArcGIS Enterprise SDK 文档。
服务器对象拦截器注意事项
在创建服务器对象拦截器 (SOI) 时,即使 SOI 仅用于增强可与地图和影像服务一起使用的众多操作中的一个或多个操作,也必须处理所有类型的收到的请求。 本部分详细将介绍您需要处理的接口,以及可使用的方法,具体视您要实现的是安全相关的功能,还是非安全相关的功能而定。
拦截 REST、SOAP 和 OGC 服务请求
地图和影像服务支持三种类型的请求:
- REST API 请求
- SOAP API 请求
- OGC 请求
为了使 SOI 拦截这些请求,必须实现以下接口:
- IRESTRequestHandler,用于处理 REST API 请求
- IRequestHandler,用于处理 SOAP API 请求,包括 ArcGIS Pro 做出的请求
- IWebRequestHandler,用于处理 OGC 请求
即使某个特定服务配置不支持 OGC 请求,也必须处理所有上述接口。 根据您要实现的业务逻辑,您可采取两种常规方法。
注:
如果地图或影像服务中包含缓存切片,则无法拦截针对这些切片的请求。
如果您要实现将会执行安全功能的 SOI,则建议您首先实现所有上述接口并阻止所有请求。 在实现自定义代码时,可在逻辑上允许通过上述接口进行访问。 如果最初没有阻止收到的请求,并随后根据需要允许进行访问,则无意中出现安全漏洞的风险会大大增加。
如果没有实现安全功能,则可通过将所有请求传递到基础标准实施来实现三个接口,从而允许正常运行。 然后,将其他业务逻辑添加至所要增强的操作中。
如果服务配置了 SOI,则服务器框架会将所有服务请求发送到 SOI。 SOI 负责过滤请求、将请求委托给地图或影像服务对象(如果适用),然后可选择在将请求返回至客户端之前进一步处理响应。
实现图层级别的访问控制
如果通过 SOI 实现图层级别的访问控制,还需要配置 ArcGIS GIS Server REST 处理程序以禁用缓存包含在此服务中的所有图层资源。 这将允许您拦截操作并过滤不允许访问的图层。 可通过在 ArcGIS GIS Server Administrator Directory 中将服务的 disableCaching 属性设置为 true 来将其禁用。
- 打开 ArcGIS GIS Server Administrator Directory 并登录。 URL 的格式通常是 https://gisserver.domain.com:6443/arcgis/admin。
- 单击服务,然后单击所需服务的名称。 如果列表中未显示该服务,则其可能位于此目录下的某个文件夹内。
- 单击 edit。
- 在服务 JSON 的 properties 部分中,添加 disableCaching 属性并将其值设置为 true,例如:
"properties": { ... "disableCaching": "true", ... },
- 单击保存编辑。
创建一个 .soe 文件
扩展模块(SOE 或 SOI)将被封装在 .soe 文件中。 该 .soe 文件包含将扩展模块注册到 ArcGIS GIS Server 时所必需的所有信息。 如果要使用 .NET,构建项目时会创建 .soe 文件。 如果使用 Java,您将通过构建 Maven SOE 或 SOI 工程创建 .soe 文件。 此外,还可使用 mvn install 的命令创建 .soe 文件,而该实用程序可以手动运行,也可集成到自动构建脚本中。
使用 ArcGIS Enterprise SDK 开发的扩展模块会将后缀 _ent 附加到其 .soe 文件名。 例如,文件名称为 SimpleRESTSOE 的扩展模块将使用输出文件名 SimpleRESTSOE_ent.soe。