SOI简单体验
导语
arcgis for server10.3.1中提供了一个新的功能叫做soi。本文简单的介绍soi概念,实现,在使用过程中的注意事项。阅读本文和使用soi需要以下先决条件
SOI是ArcGIS Server 10.3.1中新增加的功能。故开发和部署SOI需要安装ArcObject sdk 10.3.1 和 ArcGIS Server 10.3.1。
了解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简单体验的更多相关文章
- 【Cardboard】 体验 - Google Cardboard DIY及完成后简单体验
体验 - Google Cardboard DIY及完成后简单体验 今年的Google I/O最让我感兴趣的除了Material Design以外就是这个Google Cardboard了.据说是Go ...
- 将Azure计算机视觉添加到Xamarin应用程序简单体验
微软Azure提供了大量的AI及机器学习功能,可以通过简单的RestAPI调用. 关于此文中提到的Azure计算机视觉,可查看此链接的详细介绍. 通过微软的服务,只需要几行代码即可使用计算机视觉中的 ...
- Azure School,让系统化学习回归一站式的简单体验
承认吧,「终身制学习」已经成为一个不可抵挡的趋势.不管你从事什么行业,几乎已经没有什么可以一直吃老本就能搞定的事情,总有各种新的技术和概念等着你去学.至于发展速度飞快的IT 技术,不断的学习更是贯彻始 ...
- Mac mini M1使用简单体验(编程、游戏、深度学习)
好久不见了各位! 前一阵子忍不住剁手买了M1芯片的mac mini,为了弥补自己的内疚感就卖了自己的旧的mbp2017款.数据也完全迁移到了新机器上,之前的工作也就由mbp2017彻底换成mac mi ...
- Xamarin.Forms第三方XAML预览工具-LiveXAML简单体验
截至目前,Xamarin官方的Xaml Previewer工具仍然处于测试阶段,使用中也发现了各种不便,例如各种莫名其妙的渲染失败,或者提示需要编译项目才能渲染等等,复杂项目基本不可用, 完全没有体现 ...
- PX4学习之-uORB简单体验
一.前言 最近项目使用到 CPU2 与 CPU0 之间的通信, 使用定时器传递消息到 CPU0 后, CPU0 需要将消息分发到不同的应用程序里面. PX4 里面使用的是 uORB 多线程/进程通信机 ...
- Vue CLI 3.x 简单体验
文档 中文文档 补充于02月10日 vue脚手架的3.x版本已经在开发中,现在还处于alpha版本.我们来看看有哪些变化. 使用 npm install -g @vue/cli 命名方式已经改为npm ...
- Angular环境搭建及简单体验
一.安装开发环境 npm install -g typescript npm install -g @angular/cli 二.创建hello-world项目 创建项目 ng new angular ...
- CentOS, FreeBSD, Ubuntu LTS 维护风格的简单比较
https://jackqq.wordpress.com/2014/06/24/centos-vs-freebsd-vs-ubuntu-lts/ 看到周围的人好多在用或者学 CentOS,忍不住也想看 ...
随机推荐
- win32之全屏窗口
游戏开发中经常使用会让游戏以全屏窗口的状态运行,下面一个例子就是来实现这个效果的. #include <windows.h> void RegisterMyClass(); LRESULT ...
- shiro身份认证
pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...
- Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署
Centos7+PHP5.6+MySQL5.7+Zabbix4.0部署 系统版本:CentOS Linux release 7.4.1708 (Core) 最小化安装 内核版本:3.10.0-693. ...
- python学习笔记(6)--有道翻译爬虫
说明: 1. 导入三个模块,urllib.request.urlopen用来打开url链接,urllib.parse的urlencode方法将浏览器network里的data对象转为urlopen的第 ...
- [uboot]uboot如何引导系统
转自:http://bbs.elecfans.com/jishu_455028_1_1.html 如6410的bootcmd和bootargs默认存在于uboot1.1.6/include/confi ...
- Android——问题解决之adb not responding;adb不是内部或外部命令;path变量的默认值为多少
adb not responding 恩,这是出现的问题.我们开始来解决它吧! 出现这种问题大多是因为adb端口被占用导致这个问题,所以只要找到占用端口号程序,结束即可!就是这么简单(adb运行端口号 ...
- springboot日志管理+集成log4j
sprongboot使用的默认日志框架是Logback. 可以在application.properties配置简单日志属性,也可以单独配置logback.xml格式,还可以使用log4j来管理. 下 ...
- php -- 魔术方法 之 自动加载:__autoload()
自动加载类 背景: 很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件). 在 PHP 5 中,不再需 ...
- 【BZOJ】1052: [HAOI2007]覆盖问题(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1052 首先膜拜题解orz,表示只能想到二分... 贪心就是每一次找到一个最小的能包围所有点的矩阵,然 ...
- PHPMailer发送邮箱(ThinkPHP实战篇)
1.下载phpmailer文件库 2.引用文件,此处将代码放到 :函数库中,function.php function sendConsultantMessage($sendData){ Vendor ...