【转帖】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是如何工作的:

【转帖】ArcGIS Server 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扩展开发方式,在今后的时间里,我们不妨一起来研究一下。


你可能感兴趣的:(server)