导语

arcgis for server10.3.1中提供了一个新的功能叫做soi。本文简单的介绍soi概念,实现,在使用过程中的注意事项。阅读本文和使用soi需要以下先决条件

  1. SOI是ArcGIS Server 10.3.1中新增加的功能。故开发和部署SOI需要安装ArcObject sdk 10.3.1 和 ArcGIS Server 10.3.1。

  2. 了解SOE开发的流程。

什么是SOI

SOI是server object interceptors的缩写。从字面意思,是服务对象捕获器。esri对其的介绍是,用来捕获触发地图服务和影像服务内置操作的请求。

也即是任何调用server服务功能的前端,发送的请求,都能在服务器端被自定义的soi应用程序捕获到。soi可以过滤到达的请求,也可以在response中添加内容返回前端。如下示意图:

在网络开发中,有个常见的功能,就是开发防盗链。即在图片上加logo等水印。在server的出图操作中,可以运用soi,捕获每次export map返回的结果。给结果图片加上水印。

除了这种情形,还有一些,比如,针对图层和功能级别的控制都可以使用soi。

与SOE

定位上,SOE是Server Object Extension 的缩写,其旨在丰富sever服务器端能够提供的功能。而SOI旨在对每次到达服务器端的请求处理。

实现上,两种的底层的实现原理其实是一样的,编写dll,注册到服务器端。且两者的开发和部署的方式一样。安装了AO sdk 10.3.1的版本,在编辑中,新建项目可以看到多了一个SOI的模板。

soi开发编译完后,也是生成soe文件,在site中部署即可。可以直接说SOI即是一个SOE的功能子集。在SOE的开发模板中可以实现soi的这种功能。只不过使用SOE获取参数的过程,soi直接给你参数变量。具体怎么实现,这里就按下不表。

SOI的开发与实现

SOI支持 以下三种请求的捕捉:

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

根据请求类型的不一样,其需要实现的接口是不一样的,上面三种请求类型,对应需要实现的接口如下:

  • IRESTRequestHandler-rest的请求
  • IRequestHandler2-soap包括arcmap发送的请求
  • IWebRequestHandler

三种都隶属于命名空间Esri.ArcGIS.esriSystem

需要注意的是,不管你想捕获的请求是上面的那一种,这三个接口的是必须实现。如你只想捕获rest请求,但是在模板除了添加IRESTRequestHandler的实现方法,其他两个接口的方法也必须实现。 而你在其他两个接口方法中,不编写任何的处理代码。 看完这段话,也许会感到诧异,为何只需要控制一种请求,而需要实现三种方式,考虑下面的情形:

arcgis server发布的地图服务,既通过rest也通过soap对外提供服务能力。如果在开发某一个功能,特别是安全方面的控制的时候,如果只在rest的实现方式中添加控制代码而soap中不添加,就soap这端会存在安全漏洞。这个时候的建议就是在三种实现中都处理所有的请求

三种实现方式中,rest是最为简单的实现方式。所有的参数都是json的形式。其中有两个必须实现的方式,其中下面的方法,是需要开发人员处理的:


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

看下这个方法的中的输入参数名,是不是对soi的实现一目了然。在这个方法中,通过对传递过来的参数就行判断,就可以对请求进行过滤。

那怎么对输出,返回到前端的结果进行处理呢?

如果需要对结果进行处理,需要捕获response。在模板中,上面函数的返回结果就是response。

可以声明一个response变量,来接受返回。可以把模板中的return改为var response


var response = restRequestHandler.HandleRESTRequest(
Capabilities, resourceName, operationName, operationInput,
outputFormat, requestProperties, out responseProperties);

获取到response变量后对response的变量进行处理操作。

最后,在该函数的末尾自己,写一个序列化的函数return回去。可以参考ESRI.ArcGIS.SoeSupport中关于序列化与反序列化的内容。

开发完了就是部署了。需要注意的是,一个服务只能启用一个soi。 本人也思索了下这种情形的原因,因为soi本身没有增加服务的能力。在rest上,功能通过url提供,么有功能增加,url就保持不变。一个服务的多个soi的url是完全一样。

另外两种接口的实现的思路差不多,不同的是,处理的参数的类型不同。如soap的二进制等。

总结

如果有SOE的开发经历,开发SOI还是很易上手的。一开始费了劲读模板中Utilities的实现,其实这部分的内容自己完全无需了解。直接用即可。

更多内容和示例,参考AO的开发帮助。

SOI简单体验的更多相关文章

  1. 【Cardboard】 体验 - Google Cardboard DIY及完成后简单体验

    体验 - Google Cardboard DIY及完成后简单体验 今年的Google I/O最让我感兴趣的除了Material Design以外就是这个Google Cardboard了.据说是Go ...

  2. 将Azure计算机视觉添加到Xamarin应用程序简单体验

    微软Azure提供了大量的AI及机器学习功能,可以通过简单的RestAPI调用. 关于此文中提到的Azure计算机视觉,可查看此链接的详细介绍. 通过微软的服务,只需要几行代码即可使用计算机视觉中的 ...

  3. Azure School,让系统化学习回归一站式的简单体验

    承认吧,「终身制学习」已经成为一个不可抵挡的趋势.不管你从事什么行业,几乎已经没有什么可以一直吃老本就能搞定的事情,总有各种新的技术和概念等着你去学.至于发展速度飞快的IT 技术,不断的学习更是贯彻始 ...

  4. Mac mini M1使用简单体验(编程、游戏、深度学习)

    好久不见了各位! 前一阵子忍不住剁手买了M1芯片的mac mini,为了弥补自己的内疚感就卖了自己的旧的mbp2017款.数据也完全迁移到了新机器上,之前的工作也就由mbp2017彻底换成mac mi ...

  5. Xamarin.Forms第三方XAML预览工具-LiveXAML简单体验

    截至目前,Xamarin官方的Xaml Previewer工具仍然处于测试阶段,使用中也发现了各种不便,例如各种莫名其妙的渲染失败,或者提示需要编译项目才能渲染等等,复杂项目基本不可用, 完全没有体现 ...

  6. PX4学习之-uORB简单体验

    一.前言 最近项目使用到 CPU2 与 CPU0 之间的通信, 使用定时器传递消息到 CPU0 后, CPU0 需要将消息分发到不同的应用程序里面. PX4 里面使用的是 uORB 多线程/进程通信机 ...

  7. Vue CLI 3.x 简单体验

    文档 中文文档 补充于02月10日 vue脚手架的3.x版本已经在开发中,现在还处于alpha版本.我们来看看有哪些变化. 使用 npm install -g @vue/cli 命名方式已经改为npm ...

  8. Angular环境搭建及简单体验

    一.安装开发环境 npm install -g typescript npm install -g @angular/cli 二.创建hello-world项目 创建项目 ng new angular ...

  9. CentOS, FreeBSD, Ubuntu LTS 维护风格的简单比较

    https://jackqq.wordpress.com/2014/06/24/centos-vs-freebsd-vs-ubuntu-lts/ 看到周围的人好多在用或者学 CentOS,忍不住也想看 ...

随机推荐

  1. Jmeter测试带加密参数的接口

    在做接口测试时,很多时候我们都会碰到带有加密参数的接口,这种接口一般来讲都会有统一的加密方法,找开发要就好,Jmeter怎么去测呢 1.整体结构如下所示: 2.操作步骤 (1)将加密方法打成jar包放 ...

  2. saveFile()方法

    saveFile的原理就是将流写入到需要写入的文件,通过可以用“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:public vo ...

  3. github上搭建网站前台页面

    其实就是把html页面提交到github,为了能在线演示: 1. 首先在github网站找到你的项目 2. 点击设置 3. 找到这几个选项,选择master branch打钩,然后保存 4. 然后就会 ...

  4. 利用Python操作Word文档【图片】

    利用Python操作Word文档

  5. ipipe-3.10

    git://git.xenomai.org/ipipe-gch.git for-ipipe-3.10

  6. -/bin/sh: /usr/bin/xxx: not found”

    运行/usr/bin/helloworld命 令是提示“-/bin/sh: /usr/bin/helloworld: not found”,一开始我以为是helloworld没有运行权限,不过我给了它 ...

  7. 深入分析DDR(转载)

    深入分析:我们为何需要DDR2内存技术 http://www.cnblogs.com/thx-bj/archive/2008/04/02/1134040.html 文/IT168评测室特约 Myddn ...

  8. 如何解决redis高并发客户端频繁time out?

    解决方案:https://www.zhihu.com/question/24781521

  9. Hdu 2236 无题II 最大匹配+二分

    题目链接: pid=2236">Hdu 2236 解题思路: 将行和列理解为二分图两边的端点,给出的矩阵即为二分图中的全部边, 假设二分图能全然匹配,则说明 不同行 不同列的n个元素 ...

  10. CSS(六):盒子模型

    一.什么是盒子模型 盒子模型是css中一个重要的概念,理解了盒子模型才能更好的排版. 从上图可以看到标准的盒子模型范围包括margin(外边距).border(边框).padding(内边距).con ...