zoukankan      html  css  js  c++  java
  • 【转帖】ArcGIS Server REST开发模式

    如果说在2008年上半年ArcGIS9.3发布之时大家还在为rest是否合适面向数据处理的GIS应用,以及到底是SOAP还是rest等问题而争论不休,那么今天看来,基于rest的webGIS应用遍地开花,大放其采。一切似乎昭示着ADF终于快修成正果,而SOAP也岌岌可危?

    表面的现象确实如此,ArcGIS从10.0下一个版本将不再更新ADF,因为ADF与Web2.0简单而强大的理念相悖。但是作为ESRI公司WebGIS先驱的ADF,其丰富的组件、设计良好的开发框架仍不失为创建WebService的好选择,因此ADF将逐渐从前台走向后台,脱去JSF的外衣,露出丰满的类库,让你用各种WebService框架去包装她。

    SOAP为我们提供了GIS服务的通用方法,允许我们通过WSDL在客户端(相对于GIS Server而言 Web Server也是客户端)生成的值对象和代理对象来进行Server Objects的远程调用。所有的Server Objects都实现了IRequestHanlder接口,该接口用于处理SOAP请求,因此ArcGIS Server原生的支持SOAP。基于IT工业标准为SOAP带来了一些好处:通用、安全。在企业门户中用SOAP提交用户账户信息与业务请求,轻松获取该用户到网点的行车Route信息并发送到其邮箱,在类似这样的应用环境中,SOAP自然是最好的选择。但在ArcGIS Server中SOAP有着更重要的使命,那就是用作构建REST的基础。

    虽然SOAP很不错,但事实是越来越多的WebGIS应用高地已经被REST占领。原因很简单,在WebGIS中性能是比功能还要重要的一个考量,何况ArcGIS REST的功能已经足以和SOAP提供的功能相媲美。REST是一种架构风格,她用一个简单的回归-Just URLs,实现了简单、轻量、服务端缓存等多种优越于SOAP的性能。REST与SOAP本是不相干的,但ArcGIS REST是构建于SOAP之上的,我们可以通过下图来说明ArcGIS REST是如何工作的:

    我们津津乐道的REST只是存在于浏览器和Web Server之间,在一个完整的ArcGIS Server体系中包含一个Web Server,一个Server Object Manager和若干个Server Object Container,各组件以DCOM为信道,通过SOAP或者二进制的ArcObjects代理通信。正因此,我们知道在ArcGIS 组件间部署防火墙是不明智的,因为DCOM是基于RPC协议的一种二进制标准在Internet环境中难以穿越防火墙,所以适用于局域网环境。回到我们的话题,在REST的工作流程中,我们以HTTP协议将JSON请求提交给Web Server,Web Server中的SOAP proxies、ArcObjects DCOM proxies等类库将请求转换为SOAP对象或者二进制的AO代理再调用远程的GIS Server Objects进行分析处理,返回结果在Web Server上再经过转化为JSON最终返回给浏览器解释,这样就完成了整个REST会话过程。

    我们注意到Web Server和GIS Server之间以local方式连接,可以通过SOAP over DCOM和ArcObjects proxies  binary over DCOM两种方式与GIS Server交互,那么这两种方式有什么区别,我们在开发中应该如何取舍呢?

    我们应当遵循SOAP优先的原则!我们知道SOAP是通过WSDL中定义的远程调用获取服务器对象在本地的值对象,如通过getServerInfo.getDefaultMapDescription()获取的MapDescription就是一个本地值对象,但SOAP API提供的对Value Object的操作,如MapDescription.getName()则完全是在本地的操作,不涉及对远程服务器对象调用,因此执行效率高。而对AO proxies的所有操作都是在远程调用的基础上完成的,比如MapDescription.getName()是一个remote method calls的过程,加上网络延迟和服务器创建对象等其他开销,效率自然会比SOAP over DCOM低,同时,使用ArcObjects我们还需要在客户端安装更多的组件,如AO类库。因此我们建议使用SOAP优先的原则,除非遇到SOAP API无法满足的需求而必须采用AO的方式。我们看ArcGIS Server REST是如何获取MapServer的:

    public static MapServer createLocalMapServer(IServerContext context)

        {

            return (MapServer)context.getServerObject();

        }          

    public static MapServerPort createMapServerPort(IServerContext context)

        {

            return createMapServerPort(createLocalMapServer(context));

        }

    public static MapServerPort createMapServerPort(MapServer localServer)

        {

            MapServerBindingStub mapserverbindingstub = new MapServerBindingStub();

            return mapserverbindingstub;

        }

    的确,ArcGIS Server REST的实现也是遵循了SOAP优先的原则。

    和很多朋友的感受一样:ArcGIS给我们提供了一个丰富的开发框架,在这个框架之内,我们可以灵活的选择各种开发接口,甚至是搭配使用,来构建我们的应用。例如在一个以flex为前端的应用中,我们可以直接使用REST API、SOAP API(当然我们需要自己解释返回的XML);可以使用自定义的WebService,而我们的WebService可能来自于ADF、SOAP、ArcObjects或者是他们任意的组合。

    ArcGIS Server10强化了Server object extension,对于SOAP和REST都提供了实现SOE的方式,我们可以预见到SOE将会成为流行的GIS Server扩展开发方式,在今后的时间里,我们不妨一起来研究一下。


  • 相关阅读:
    【Azure Redis 缓存】Azure Redis 功能性讨论二
    【Azure Developer】如何用Microsoft Graph API管理AAD Application里面的Permissions
    【Azure 环境】通过Python SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?
    【Azure 应用服务】App Service与APIM同时集成到同一个虚拟网络后,如何通过内网访问内部VNET的APIM呢?
    【Azure 云服务】如何从Azure Cloud Service中获取项目的部署文件
    【Azure Redis 缓存】Azure Redis 异常
    【Azure 微服务】基于已经存在的虚拟网络(VNET)及子网创建新的Service Fabric并且为所有节点配置自定义DNS服务
    【Azure Redis 缓存】遇见Azure Redis不能创建成功的问题:至少一个资源部署操作失败,因为 Microsoft.Cache 资源提供程序未注册。
    【Azure Redis 缓存】如何得知Azure Redis服务有更新行为?
    【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误
  • 原文地址:https://www.cnblogs.com/goed/p/1850665.html
Copyright © 2011-2022 走看看