前言

SOE的提供了REST和Soap两种模板,只要在模板特定的方法中添加自己的业务逻辑代码即可,开发流程非常的简单便捷。那怎么知道自己的业务逻辑代码该写在模板的那个方法里面呢?这就需要很好的理解SOE的生命周期以及生命周期在模板中的对应。这里将以SOE开发流程来介绍SOE开发rest模板。

环境说明:arcgis server 10.2,visual studio 2012

一、soe的开发流程

通常soe的业务开发流程通常包括以下方面:

1.客户端将参数进行序列化成json对象,通过http协议将参数传递给服务器端

2.服务器端接受和处理参数

通过接受前端的json,反序列化成需要的对象类型,如常见的string,double,或者ao对象如IGometry等

3.业务处理阶段

该阶段调用ArcObject的接口,通常该阶段的代码可以直接从桌面的ao程序移植过来

4.最后阶段是结果返回到前端

soe的前后端的交互是基于http协议的,故结果可以序列化成json返回前端,也可以是图片的形式等符合http协议传输的内容

上图是一个点生成缓冲区的soe实现流程:

1.从客户端获取屏幕坐标点,将屏幕坐标点以json的形式返回到服务端

2.服务端以JsonObject对象实例中反序列化获取参数,

3.参数转换成Ipoint对象

4.调用Ao接口对IPoint对象进行buffer

5.buffer的结果序列化成json对象返回给前端

二、模板及模板对应流程

2.1 模板头

安装完ao sdk,就能以rest或者soap模板的形式实现soe了,打开soe rest模板,前面guid表明soe是com对象的形式实现,

1.指定soe扩展的服务类型,该为10.2版本soe的新特性,在10.2以前的版本中,soe只能扩展MapServer,而10.2的版增加了对imageServer的扩展,

tips:在10.2 rest模板中必须手动选择是扩展MapServer还是imageServer而10.2以前的版本是不需要的

2.all Capabilities 指soe支持的操作,里面填写的名字应该与后面的operation对应

tips:注意区分这里的Capabilities与服务编辑对话中的Capabilities的区别。这里的Capabilities的可以理解成操作

3.defaultCapilites 是这默认的操作

4.description soe的描述,部署soe后在manager中可以看到期描述

5.soe的显示名称

6.Properties是soe的属性

7.表明是一个rest模板

2.2 IServerObjectExtension 接口的成员

该接口Init()和shutdown()方法是必须实现的接口,这两个方法分别在soe的初始化和关闭的时候触发。

Tips:通过该系列文章1可知,soe的初始化只执行一次,故可以将只需执行一次且耗时的操作放在Init()方法中,比如从MapServer中获取相关的数据

      public void Init(IServerObjectHelper pSOH)
{
serverObjectHelper = pSOH;
} public void Shutdown()
{
}

而在Shutdown()方法中可以添加对象释放代码,则在soe关闭后释放资源

IObjectsCostruct接口成员

该接口只有一个成员Construct()方法,通常在该方法中获取soe的属性。也可以将比较耗时的操作放在该方法里。

  public void Construct(IPropertySet props)
{
configProps = props;
}

Tips:soe的属性是soe的管理人员用来对客户端端使用soe的控制,比如点创建buffer,buffer的半径是不断的变化的,今天只允许客户端创建不大于5m buffer,明天也许只允许客户端创建不小于5m的buffer,soe可以将缓冲距离设置成属性,通过在manager里面更改属性值,就可以很好的控制而不需要重新对soe代码更改。

IRESTRequestHandler 成员

GetSchema()和HandleRESTRequest(),获取schema,和处理和返回前端的请求。这两个方法中的代码保存不动。

        public string GetSchema()
{
return reqHandler.GetSchema();
} public byte[] HandleRESTRequest(string Capabilities, string resourceName, string operationName, string operationInput, string outputFormat, string requestProperties, out string responseProperties)
{
return reqHandler.HandleRESTRequest(Capabilities, resourceName, operationName, operationInput, outputFormat, requestProperties, out responseProperties);
}

CreateRestSchema()。该方法位于命名空间ESRI.Arcgis.SOESupport中返回一个RestResource对象创建SOE的Schema,返回RestResource对象,从单词的字面意思也可以看出,该方法是创建一个Rest资源。

Schema是有资源和操作组成json对象,在下面的代码片段中出,声明了一个rootRes资源,并为该资源添加了一个sampleOper对象操作,操作名称为sampleOperation,该操作包含两个参数parm1,parm2,这两个参数来自于前端,该操作的具体实现通过一个委托SampleOperHandler实现。

可以为一个soe创建多个资源和操作,资源还可以添加子资源,每个子资源可以添加操作。tips:注意这里参数名和代理的名和下面操作的函数要匹配。

   private RestResource CreateRestSchema()
{
RestResource rootRes = new RestResource(soe_name, false, RootResHandler); RestOperation sampleOper = new RestOperation("sampleOperation",
new string[] { "parm1", "parm2" },
new string[] { "json" },
SampleOperHandler); rootRes.operations.Add(sampleOper); return rootRes;
}

RootResHandler()。

SampleOperHandler()。操作的handler函数,这是SOE的核心。soe的大部分流程在该方法中实现

  private byte[] SampleOperHandler(NameValueCollection boundVariables,
JsonObject operationInput,
string outputFormat,
string requestProperties,
out string responseProperties)
{
responseProperties = null; string parm1Value;
bool found = operationInput.TryGetString("parm1", out parm1Value);
if (!found || string.IsNullOrEmpty(parm1Value))
throw new ArgumentNullException("parm1"); string parm2Value;
found = operationInput.TryGetString("parm2", out parm2Value);
if (!found || string.IsNullOrEmpty(parm2Value))
throw new ArgumentNullException("parm2"); JsonObject result = new JsonObject();
result.AddString("parm1", parm1Value);
result.AddString("parm2", parm2Value); return Encoding.UTF8.GetBytes(result.ToJson());
}

1.参数的反序列化

JsonObject对象提供了很多的Tryget**()方法,如下图所示:

将前端传递过来的json对象反序列化成所需对象,如TryGetAsString获取将json参数转换成string类型的参数。方法的第一参数string为参数的名称,如param1,与操作中参数名称保存一致。

Tips:在转换的时候esri做了智能处理,会判断客户端参数的情况将默认其转换类型。比如你前端传递的参数是12345,soe默认是转成数字而不是string,如果在soe端用tryasstring方法,就不能获取到值。这种智能也给造成麻烦。解决办法是可以将转成object对象,再转成string

2.业务逻辑的实现,可以在这里使用ao的相关代码

3.处理结果序列化

该结果是反序列化的逆结果,如上面模板代码中的addstring,将string对象反序列化话成json等等。除了上面提到的常见数据类型的序列化与反序列化,esri.arcigs.soesupport ,还直接提供了ao对象的如Igometry,IRecordSet等的序列与反序列化,如下图所示

三、SOE从MapServer中获取数据源

soe开发中,一个必须的环节是MapServer中获取业务数据,其中提供了IMapServerDataAccess接口,该接口通过GetDataSource、GetDisplayDataSource获取数据源,当获取的图层是栅格图层则是IRaster类型,矢量是IFeatureClass,表为ITable类型。这两个方法都能获取数据源,不同的区别在当数据源存在关联数据时,GetDataSource不能获取关联数据,而后者是可以的。

从10.1以来,server的服务的发布采用msd的形式,而不是mxd,地图绘制引擎发生了改变,这使得在网络端,地图的绘制速度,效果更佳。这样做带来一个麻烦就是,ao中的渲染接口针对的mxd。地图服务就不能使用ao的carto库中的接口进行渲染,避免使用的mxd的相关的crato接口imap,Ilaye,ifeaturelayer,和页面布局等相关的接口。

tips:在10.1MapServer通过msd发布,不像以前的版本可以获取整个地图文档,而现在只能获取图层,如果你对获取的图层进行了更改,并不会对mapserver本身发生更改。

Server Objects Extension(SOE)开发(二)的更多相关文章

  1. Server Objects Extension(SOE)开发(三)

    前言 SOE出现之前,一些复杂.耗时的gis操作,通常都是使用gp服务实现的.前面将gp服务和soe进行了对比分析,为了测试两种的效率,曾经做了个demo,使用soe和gp同时执行相同的业务逻辑,记录 ...

  2. Server Objects Extension(SOE)开发(一)

    1.SOE相关 1.1 什么是SOE SOE(Server对象扩展:Server Object Extenstion),其通过采用ArcObjects的相关的接口.类库对ArcGIS Server的基 ...

  3. ArcGIS SOE开发异常之 ClassFactory cannot supply requested class

    最近SOE开发一个功能,辛辛苦苦写完, 异常: ClassFactory cannot supply requested class 辛苦解决: 百度一下,描述这个问题的帖子很多,不过内容基本一致.大 ...

  4. SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

    原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...

  5. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》

    一.课程笔记 1.1  软件开发周期 (1)需求分析阶段 分析客户的业务和数据处理需求. (2)概要设计阶段 设计数据库的E-R模型图,确认需求信息的正确和完整. /* E-R图:实体-关系图(Ent ...

  6. Python服务器开发二:Python网络基础

    Python服务器开发二:Python网络基础   网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.包括: ...

  7. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  8. javaweb学习之Servlet开发(二)

    javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个< ...

  9. Java Web高性能开发(二)

    今日要闻: 性价比是个骗局: 对某个产品学上三五天个把月,然后就要花最少的钱买最多最好的东西占最大的便宜. 感谢万能的互联网,他顺利得手,顺便享受了智商上的无上满足以及居高临下的优越感--你们一千块买 ...

随机推荐

  1. jsoup爬虫简书首页数据做个小Demo

    代码地址如下:http://www.demodashi.com/demo/11643.html 昨天LZ去面试,遇到一个大牛,被血虐一番,发现自己基础还是很薄弱,对java一些原理掌握的还是不够稳固, ...

  2. SSM&SSH项目中 springmvc 乱码问题解决

    需要在web.xml文件中配置过滤器: <!-- 过滤器 过滤乱码 --> <filter> <filter-name>characterEncodingFilte ...

  3. 利用pandas进行数据分析之ndarray结构

    Numpy的重要特点就是其N维数组对象, 1.ndarray每个元素是相同的,每个数组都有一个两个对象: .shape:用于表示维度大小的元组 .dtype:用户表示数组类型的对象 2.创建数组 ar ...

  4. Smooks转换设计

    Smooks转换设计 背景 不同的合作银行对应的外部接口是不一样的,我们需要把外部这些变化不定的接口格式,转换为我们银保通系统可以识别的内部接口.Smooks可以很好的解决这一问题.并且,当合作银行的 ...

  5. VB的第一个项目

     前言-----本人也是刚刚接触VB,企业的VB代码基本能看的懂,但是自己开发,只能呵呵.一般在刚学习一门新的语言时,很容易发生一些自己相当然的认识错误,so,记下并分享开发学习的过程,望指正.--- ...

  6. js判段URL是否可用(js判段网络是否不可用)

    下面亲自測试可行: 兼容全部浏览器,用JQuery的方法,能够判段URL是否可用.也能够判段网络是否不可用(前提:假设URL可用.返回也不是200,那就说明是网络不可用.能够以此作为网络是否可用的判段 ...

  7. 小程序排错(redis导致)

    小程序突然出问题,题库加载不了,程序正常,测试环境同样环境,同样代码都正常,但是线上数据秒过期,怀疑redis过期时间设置有问题,但是检查配置没问题,写入数据带过期时间也正常. redis设置key: ...

  8. POJ 3667 Hotel(线段树)

    POJ 3667 Hotel 题目链接 题意:有n个房间,如今有两个操作 1.找到连续长度a的空房间.入住,要尽量靠左边,假设有输出最左边的房间标号,假设没有输出0 2.清空[a, a + b - 1 ...

  9. STM32在程序运行过程中关闭定时器重新打开后定时器不工作的问题

    问题:数码管显示程序放在定时TIM2中断函数里面扫描,想要实现在关闭某一功能的时候数码管不显示. 刚开始的想法是开关关闭,关闭定时器时钟:开关打开,打开定时器时钟:(但实验证明再次打开开关时定时器2却 ...

  10. RunTime.getRunTime().addShutdownHook用法

    今天在阅读Tomcat源码的时候,catalina这个类中使用了下边的代码,不是很了解,所以google了一下,然后测试下方法,Tomcat中的相关代码如下: Runtime.getRuntime() ...