产品应用与技术推广部ArcGIS10.1forServerSOE介绍及开发Esri中国信息技术有限公司2012年6月产品应用与技术推广部《版权声明》本文档版权为Esri中国信息技术有限公司所有。未经本公司书面许可,任何单位和个人不得以任何形式摘抄、复制本文档的部分或全部,并以任何形式传播。——制定及修订记录——版本完成日期编写/修订纪要编写者备注V0.12012-6-4刘宇V0.22012-6-11刘宇产品应用与技术推广部I目录SOE介绍及开发................................................................................................................................1第一章SOE由来.......................................................................................................................1第二章SOE使用.......................................................................................................................31.1必选接口...........................................................................................................................31.1.1IRESTRequestHandler接口.....................................................................................31.1.2IServerObjectExtension............................................................................................41.2可选接口...........................................................................................................................51.2.1IObjectConstruct......................................................................................................51.2.2IObjectActivate........................................................................................................51.3创建SOE............................................................................................................................61.4部署SOE..........................................................................................................................111.5使用SOE..........................................................................................................................18产品应用与技术推广部II产品应用与技术推广部1SOE由来第一章在ArcGIS10.1中ArcGISServer不在支持DCOM方式的连接,这也就意味着我们不能通过本地方式的连接使用ArcObjects提供的更多功能,所以我们推荐一种新的方式来实现这些功能,这种方式就是SOE服务器对象扩展,一个SOE(ServerObjectExtension)就是一个包含一组方法的类,这个类可以在SOC中运行,并且可以被web应用程序调用。ServerObjects是粗粒度的AO组件,是一个可以执行特定操作的高级对象,它隐藏了细粒度的ArcObject。ServerObjects的粗粒度接口支持对于像绘制地图或地理编码等整体性任务。Serverobjects也有SOAP接口,可以把serverobjects暴露成WebService,从而可以被客户端使用。SOE是开发者的一个高级选项,使您能够将ArcGISServer服务基本功能进行扩展。SOE具有两大优势:1.SOE可以作为SOAP或RESTWeb服务,使得用ArcGISWebAPIs建立的客户(用于JavaScript、Flex、Silverlight、iOS等)以便调用这些应用程序。事实上,您的SOE将出现在ArcGISServicesDirectory之内,并将提供特性设置、基本类型等ArcGISAPIs能够理解的典型对象类型。2.SOE能够对ArcObjects进行有效封装,提供理想环境以快速执行您的指令。.可以建立一个SOE,使用动态分段获取里程标志位置,或者实现几何网络分析(在ArcGIS10的时候,因为工具箱中没有提供几何网络的GP,因此要实现几何网络的分析,可以通过这种办法)产品应用与技术推广部2SOE开发需要ArcObjects、.NET或Java以及REST与SOAP等Web服务通信技术的知识。ArcObjectsSDK具有多种可供您进行校验的样本,即可用于Java也可用于.NET。在SOE的开发过程中,我们必须清楚,我们需要在SOE中将请求获取,然后将传入的参数转化为AO,然后通过AO处理,再将处理的结果转成json格式,传给客户端,客户端得到json格式的结果,然后解析。下图描述了请求响应的整个过程,如下图:下图描述了请求回复的整个过程,如下图:产品应用与技术推广部3SOE使用第二章必选接口1.1IRESTRequestHandler接口1.1.1该接口主要有下面两个方法:stringGetSchema();byte[]HandleRESTRequest()1.1.1.1IRESTRequestHandler.handleRESTREquest()方法主要有下面两个作用:回调资源和操作的方法获取资源在实例级别的描述产品应用与技术推广部4该方法在识别这两个作用的时候是通过operationName参数,如果该参数是空字符产那就是第二个作用,否则是第一个作用。该方法的参数如下:1.Stringcapabilities:一组被资源授权的操作,可以为空字符串2.StringresourceName:资源名称.空字符串表示根级别,子资源会通过‘/’表示3.StringoperationName:操作名称4.StringoperationInput:操作的参数,JSON格式5.StringoutputFormat:客户端请求的输出格式,如JSON,AMF6.String[]responseProperties:通过操作返回的一组键值对,逗号分开1.1.1.2IRESTRequestHandler.getSchema()方法以JSON格式返回SOE的资源列表IServerObjectExtension1.1.2该接口主要有个方法:Init(IServerObjectHelperpSOH)和voidShutdown();当Server启动的时候会调用该方法,并将IServerObjectHelper对象传入,该接口是对Server对象的弱引用,可以通过IServerObjectHelper.ServerObject得到服务器对象。Shutdown方法用在服务器关闭时调用,经常我们在该方法中释放SOE中使用的资源。产品应用与技术推广部5可选接口1.2IObjectConstruct1.2.1该接口只有一个方法Construct,该方法在Init方法执行后,立即被执行,如果我们的SOE有配置属性,就可通过该方法的参数得到,该方法只调用1次,我们可以将SOE中用的的比较耗费资源的逻辑写在该方法中,比如:获取地图代码,或者你始终操作某一个图层,就可以把获取该图层的代码写在这里。IObjectActivate1.2.2当init和Construct调用后,SOE的对象已经被创建,并且相应的配置信息也得到了,如果SOE的整个逻辑中需要不停的获取和释放服务器上下文,那么就必须实现改接口,改接口有两个方法:activate()和deactivate(),当客户端调用CreateServerContext()的时候activate()方法被调用,当客户端释放服务器上下文对象时deactivate()方法被调用。SOE的执行过程在对接口介绍的时候,我们已经提到了SOE的的运行过程,我们通过下面的图可进一步了解:产品应用与技术推广部6创建SOE1.3现在我们创建一个完整的SOE,在VS2010中新建一个项目,选择ServerObjectExtention,并在右边选择REST模板,如下图:当点了确定之后,我们可以看到VS已经为我们生成了一个RestSOETest的类,该类已经实现了了我们前面介绍过的接口,如下:publicclassRestSOETest:IServerObjectExtension,IObjectConstruct,IRESTRequestHandler产品应用与技术推广部7{privatestringsoe_name;privateIPropertySetconfigProps;privateIServerObjectHelperserverObjectHelper;privateServerLoggerlogger;privateIRESTRequestHandlerreqHandler;publicRestSOETest(){soe_name=this.GetType().Name;logger=newServerLogger();reqHandler=newSoeRestImpl(soe_name,CreateRestSchema())asIRESTRequestHandler;}#regionIServerObjectExtensionMemberspublicvoidInit(IServerObjectHelperpSOH){serverObjectHelper=pSOH;}publicvoidShutdown(){}#endregion#regionIObjectConstructMemberspublicvoidConstruct(IPropertySetprops){configProps=props;}#endregion#regionIRESTRequestHandlerMemberspublicstringGetSchema(){returnreqHandler.GetSchema();}产品应用与技术推广部8publicbyte[]HandleRESTRequest(stringCapabilities,stringresourceName,stringoperationName,stringoperationInput,stringoutputFormat,stringrequestProperties,o