导语

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. centos 搭建nginx

    yum install wget yum install gcc-c++ yum -y install pcre prec-devel yum -y install zlib zlib-devel y ...

  2. vue知识点2018.6.3

    文件夹和文件名称 简介 build 构建脚本目录 config 应用程序的配置文件 index.html 入口页面 node_modules 存放 NPM 依赖模块 package-lock.json ...

  3. python学习笔记(8)--爬虫下载占位图片

    说明: 1. 虽然很简单,但总忘,所以还是记下来吧! 2. http://placekitten.com/300/300这个画猫的网站老是打开没有图片,改成了http://placehold.it/3 ...

  4. python操作word

    python教程(百度经验) Python 操作Word(Excel.PPT等通用)   import win32comfrom win32com.client import Dispatch, co ...

  5. 记录一个glibc 导致的段错误以及gdb 移植

    上一篇我有相关关于一个段错误的记录,现在记录当时的段错误具体是在哪里的. // 从 GNU 的官网下载当前在使用的 glibc 的源代码以及最新的 glibc 源代码 // 地址如下: http:// ...

  6. winxp退市是微软windows操作系统的滑铁卢

    winxp退市是微软windows操作系统的滑铁卢 兵败如山倒,windowsxp退市.宣布微软时代结束,windows将逐步退出中国市场,取而代之将是中国人自己的操作系统.中国人努力.中国人加油,不 ...

  7. LigerUI 树状列表折叠显示

    http://blog.csdn.net/haojuntu/article/details/8626040 —————————————————————————————————————————————— ...

  8. javascript父、子页面交互小结

    帧用来存放子页面,既可以是iframe,又可以是frameset.window对象是全局对象,页面上的一切函数和对象都在它的作用域里.     1.parent代表父窗口.如果父窗口又存在若干层嵌套, ...

  9. [android] AndroidManifest.xml - 【 manifest -> 其他次要配置】

    <uses-sdk> 作用:使应用程序的兼容性更好,指明应用程序需要的最小API,编译API以及最大支持的API.值都是整数 <uses-sdk android:minSdkVers ...

  10. hdu 1147:Pick-up sticks(基本题,判断两线段相交)

    Pick-up sticks Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...