SOI简单体验
分享
导语
arcgis for server10.3.1中提供了一个新的功能叫做soi。本文简单的介绍soi概念,实现,在使用过程中的注意事项。阅读本文和使用soi需要以下先决条件
什么是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支持 以下三种请求的捕捉:
根据请求类型的不一样,其需要实现的接口是不一样的,上面三种请求类型,对应需要实现的接口如下:
三种都隶属于命名空间Esri.ArcGIS.esriSystem
需要注意的是,不管你想捕获的请求是上面的那一种,这三个接口的是必须实现。如你只想捕获rest请求,但是在模板除了添加IRESTRequestHandler的实现方法,其他两个接口的方法也必须实现。 而你在其他两个接口方法中,不编写任何的处理代码。 看完这段话,也许会感到诧异,为何只需要控制一种请求,而需要实现三种方式,考虑下面的情形:
三种实现方式中,rest是最为简单的实现方式。所有的参数都是json的形式。其中有两个必须实现的方式,其中下面的方法,是需要开发人员处理的:
看下这个方法的中的输入参数名,是不是对soi的实现一目了然。在这个方法中,通过对传递过来的参数就行判断,就可以对请求进行过滤。
那怎么对输出,返回到前端的结果进行处理呢?
如果需要对结果进行处理,需要捕获response。在模板中,上面函数的返回结果就是response。
可以声明一个response变量,来接受返回。可以把模板中的return改为var response
获取到response变量后对response的变量进行处理操作。
最后,在该函数的末尾自己,写一个序列化的函数return回去。可以参考ESRI.ArcGIS.SoeSupport中关于序列化与反序列化的内容。
开发完了就是部署了。需要注意的是,一个服务只能启用一个soi。 本人也思索了下这种情形的原因,因为soi本身没有增加服务的能力。在rest上,功能通过url提供,么有功能增加,url就保持不变。一个服务的多个soi的url是完全一样。
另外两种接口的实现的思路差不多,不同的是,处理的参数的类型不同。如soap的二进制等。
总结
如果有SOE的开发经历,开发SOI还是很易上手的。一开始费了劲读模板中Utilities的实现,其实这部分的内容自己完全无需了解。直接用即可。
更多内容和示例,参考AO的开发帮助。
文章来源:http://www.cnblogs.com/myyouthlife/p/4903840.html
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的开发帮助。
文章来源:http://www.cnblogs.com/myyouthlife/p/4903840.html
0 个评论
推荐内容
- ArcGIS Pro 2.4向独立server发布服务步骤
- Linux上安装ArcGIS Enterprise超详细教程——以Redhat7.2上安装ArcGIS Enterprise 10.5为例
- ArcGIS for Server 10.x 许可授权手册
- Portal for ArcGIS 10.X许可授权手册 (Windows版)
- arcgis server 无法手动删除切片
- ArcGIS for Server内置JS Viewer的离线部署和配置
- Linux上安装ArcGIS for Server超详细教程——以Redhat6.5上安装ArcGIS for Server 10.3.1为例
- 如何创建Geometry Service?
- 地图服务优化策略
相关问题
- 请问一个高手比较简单的问题,如何将BaseCommand类中的默认的小兔子图标换成自己自定义的图标那?
- 在spring后台,用java语言,做一些简单的几何操作,例如求缓冲区,求两个面相交部分等,有何解决方案?
- ArcGIS Pro和ArcMap的GP工具性能上有多大的差异?有没有简单的测试数据?
- Problem: 当使用 Oracle Spatia 的Data Interoperability 工具时,在SDO_GEOMETRY中的多边形被转化为简单方式
- 为什么ArcGIS API forJavaScript 4.0在IE11中连简单的sample都无法打开?
- 你好,arcgis api for javascript如何根据经纬度进行标注,类似百度地图的Marker标注功能,代码越简单详细越好,谢谢你了
- 【Desktop】工具错误码-000382 : <值> 是非简单要素类型。
- 【Desktop】工具错误码-050080 : <值> (OID: <值>、<值>)相交失败,结果不是简单的结果。
- Bug: 使用Visio创建复合关系,导入成Geodatabase时,变为简单关系
- 【Desktop】工具错误码-000986 : <值> 包含非简单要素的完整列表。
- 【Desktop】工具错误码-045003 : 指定的地统计图层不是简单克里金地统计图层。