开发 SOI


来源

开发SOI

拦截 REST、SOAP 和 OGC 服务请求

地图和影像服务(包括地图和影像服务扩展,例如要素服务)支持三种不同类型的请求:

  • REST API 请求

  • SOAP API 请求

  • OGC 请求

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

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

所有这些接口都可以在 Esri.ArcGIS.esriSystem 命名空间中找到

即使特定的服务配置不支持 OGC 请求,您也需要处理上述所有接口。

根据您正在实施的业务逻辑,您可以采用两种通用方法。

  • 如果您正在实现一个【执行安全功能的 SOI】,那么建议您首先实现上述所有接口并阻止所有请求。当您实现自定义代码时,您可以在逻辑上允许通过上述接口进行访问。如果您最初没有阻止传入请求并随后根据需要允许访问,则您会冒更大的风险无意中暴露安全漏洞。【译注:为实现安全功能,需先阻止所有请求,然后再根据需要允许对应访问的发生】
  • 如果您没有实现安全功能,您可以通过将所有请求传递给【底层标准实现】来实现这三个接口,以实现正常功能,然后将其他业务逻辑添加到您希望增强的一个或多个操作中。

当一个服务配置了 SOI ,服务器框架会把【所有对这个服务的请求】都路由到 SOI。SOI 负责处理请求,将请求委托给实际的地图或影像服务对象(如果适用),然后在将响应返回给客户端之前,选择是否进一步处理响应。

实现 IRESTRequestHandler 接口

所有操作参数和响应都是 text/json 格式,并且可以轻松记录到磁盘。

该接口主要包含以下功能:

[C#]

public byte[] HandleRESTRequest(string capabilities, string resourceName, string
    operationName, string operationInput, string outputFormat, string
    requestProperties, ref string responseProperties);

该函数根据资源和操作及其相应的请求属性对 REST API 进行建模。operationInput 参数通常包含一个表示输入的 JSON 对象。您可以使用所选平台中可用的 JSON 库轻松过滤此对象。为了获得服务的默认配置,【REST 服务目录】通过为所有参数传入空 JSON 对象来调用此操作。通过将此调用委托给底层服务,然后在 SOI 中操作输出,您可以影响服务目录和客户端呈现的资源(层)和操作(导出、查找、识别等)。

另一个必须处理的功能是:

[C#]

public string getSchema()

此函数通知 【REST 服务目录】如何表示服务配置。通常,您的 SOI 实现应该将此调用委托给底层地图或影像服务对象,然后根据需要选择性地操作输出。

实现 IRequestHandler2 接口

此接口的实现涉及更多,因为它处理二进制请求(来自 ArcGIS for Desktop 和其他基于 ArcObjects 的应用程序)和 SOAP 请求(来自自定义 SOAP 客户端)。

无论哪种情况,您都需要使用 ArcObjects API 来解包传入的请求;然后根据需要,选择是否修改请求参数;然后重新打包请求并发送到底层【地图或影像服务对象】。

要对响应进行“返回前处理”,您需要使用 ArcObjects API 来解包响应,然后再将其发送到客户端。SDK 中包含了一些实用程序类,来帮助您打包和解包响应对象。

此接口包含您需要实现的两个方法:

[C#]

public byte[] HandleBinaryRequest2(string capabilities, byte[] request)

当服务器接收到服务的二进制请求(来自 ArcGIS for Desktop)时,将调用上述函数。request 参数包含的二进制请求,必须使用 ArcObjects API 解包。

[C#]

public string HandleStringRequest(string capabilities, string request)

当服务器接收到 SOAP (XML) 请求时调用此函数。SOAP 客户端通常会发出这些请求。request 参数包含的 XML 请求,必须使用 ArcObjects API 解包。

实现 IWebRequestHandler 接口

IWebRequestHandler 接口,可以实现拦截 KML 请求和 OGC 服务请求(WMS 和 WFS)的功能。接口中的方法(HandleStringWebRequest)代表了一个典型的 OGC 请求:一个带有查询参数的 HTTP 请求。您需要实现以下功能:

[C#]

public byte[] HandleStringWebRequest(esriHttpMethod httpMethod, string requestURL,
    string queryString, string capabilities, string requestData, ref string
    responseContentType, ref int respDataType)

requestData 参数通常是 text/xml 格式,并作为请求的输入。但是,参数通常通过 queryString 参数发送。respDataType 参数通知您的代码必须如何解释【返回的值 byte []】。如果 respDataType 指示其为文件,则您的代码必须流式传输文件路径的内容而返回 byte []respDataType 通知 Web 处理程序【在响应 HTTP 请求时】要设置的内容类型。

用于处理 JSON 和【基于 ArcObjects 的结果】的实用程序类

名为 SOISupport 的实用程序类,可作为“关于层访问”的示例的一部分。该实用程序类,包含了用于与父服务交互的、可委托传入请求的方法,包含了用于在 ArcObjects 响应对象之间进行转换的方法等等。有关如何使用这些方法的示例,尤其是在处理 SOAP 和二进制请求时,请参阅 层访问示例。 ESRI.ArcGIS.SOESupport 程序集中的其他类,提供了处理 JSON 数据和对象的功能。