ArcGIS Server学习3
ArcGIS Server是一个服务器端的AO组件集,我们对AS的编程操作,都意味着对远端服务器上对象的操作,这是一个很大的不同。以使用AE开发成为为例,我们新建一个对象,使用的是new关键字,这是在本地机器上新建一个对象的操作,这个操作一直封装在一个进程中。而AS的开发,意味着本地的一个对象,必须调用远端的一个对象来实现某种功能,本地的操作进程与远程的操作进程实际上是两个不同的进程,如何在两个进程之间进行通讯呢?
AS使用了分布式对象技术DOT来处理这个问题,ADF提供了一系列所谓的ArcObjects proxy对象,一个proxy对象就是一个远端对象在本地的引用,它的接口和方法与proxy对象的远端对象完全一致,这样,我们对proxy对象的操作,就会直接影响到它代理的远端对象。
我们说过,AS是一个三层模型,其中通过浏览器访问的WEB程序和WEB服务都是放在第二层,即WEB服务器上的,为了让WEB服务器上的程序能够通过操作AO组件来与GIS服务器上的AO组件进行交互,我们需要在WEB服务器上安装ADF,如果是发布的话,安装ADF Runtime就行了。因此,AO的proxy对象都是安装在web服务器上的。
WEB程序或WEB Service使用的组件是Server API,这些API分为三种:Server API,.NET WebControl和Java WebControl。
当一个WEB应用程序连接到GIS服务器的时候,WEB程序使用的Server API将调用一个代理对象去访问远程服务器上的SOM对象,并通过SOM对象寻找到SOM管理的Server Object对象。它使用了分布式对象技术DOT。这个过程是这样的:
IGISServerConnection pGISServerConn=new GISServerConnectionClass();
pGISServerConn.Connect("nbjbt");//连接到GIS服务器
IServerObjectManager SOM=pGISServerConn.ServerObjectManager;//找到GIS Server上的SOM
IServerContext pServerContext=SOM.CreateServerContext("nbserver","MapServer");//通过SOM创建一个服务器对象的上下文
IServerObject pSO=pServerContext.ServerObject; //从上下文对象找到服务器对象
IMapServer pMapServer=(IMapServer)(pSO);//使用IMapServer接口来访问服务器对象
。。。。。。
pServerContext.ReleaseContext();//释放服务器对象的上下文,即关闭该进程
ServerContext本质上是一个GIS服务器上的进程,它也是我们服务器端编程的起点。因此,我们是通过CreateServerContext命令在服务器端上创建的,而不是使用NEW关键字在本机上创建。我们是通过这个进程在访问服务器对象nbserver。我们的工作也是在这个进程中完成的。
既然是在一个进程中编程,那么,在这个进程中新建一个对象使用的关键字就不是NEW了,而是下面的方式:
新建对象 pSC.CreateObject("esriGeometry.IPoint")
将一个对象放入一个进程 pSC.LoadObject(pPt)
将一个对象放在进程的字典中pSC.SetObject("a",pPt)
将对象从进程字典取出pNewPt=pSC.GetObject("a")
ServerObject的池化和非池化模式
当我们访问一个服务器对象Server Object的时候,这个对象是已经存在的呢?还是在访问时新建的?都有可能,这取决于我们如何选择。如果我们选择共享池化模式,则在SOM启动的时候,SOM就建立了几个SO供外界访问,一个SO被A请求访问后,被释放回共享池中,还可以下次被B访问使用,因此,SO将可以被多个用户访问。如果是非共享池模式,当一个请求访问时,SOM专门为它新建一个SO。
这样,在池化模式下,访问与SO的比例不是1:1,它支持更多的用户;而非池化模式就是1:1的,它支持的用户比池化模式少。
SO放在什么地方,对,它就放在一个Server Context中,即一个进程中。一个访问连接到SO,是一个例程,这个例程是放置在一个进程中的。而对于这个进程的特征,我们还需要进一步设置,即进程的孤立性。如果Server Context是高孤立的(high isolation),那么一个进程中只能放置一个例程,这样保障了安全性;如果是低孤立的,四个访问连接的例程都可以放置在一个进程中,它的特点是节约资源。至于如何设置,就有必要考虑我们的硬件设备了。
池化和非池化的设置对状态或非状态的应用程序也有影响,这些我们将在后面的blog中提到。
Related Items
Comments
AJAX是一种客户端技术,当通过web客户端来展示,它使用XHR对象取代页面与服务器进行访问,XHR与<DIV>对象结合使用,可以避免页面的完全刷新。如果使用在AS上,可以考虑使用XHR来通过SOAP或HTTP访问地图服务器。至于提高页面速度,地图传输速度等,倒不一定。商业地图网站为了提高访问速度一般是在服务器端使用瓦片技术实现的。
你好,我最近在看arcserver arc object api开发,上面提到coarse-grained server object和finer-grained ArcObjects,这块不是很明白,能不能指点下这个部分
我给你的建议是,别看这个API了,去看看REST API或JS API更好。
kingkoo 于 2009-8-5 8:58:48 回复恩,最近刚刚开始看server,帮助看的迷迷糊糊的,刚把web adf开发看了一部分,你能不能指导下按照哪几个部分看比较好
楼主好样的,你的文章我拜读了
楼主请问一下:WEB Server这一端如果需要开发基于AS的应用,需要安装ADF,ADF是个开发平台还是开发组件呢?如果ADF是个开发平台,那么基于AS的开发还需要使用VS.NET里面的ASP.NET 来开发么?如果是组件,能不能理解成它像是在VS.NET里的桌面应用程序里引入的MO组件一类的东西呢?楼主能举个网站的例子么?最好能举个很详细的架构的例子,比如说客户端需要html+javascript,服务器端需要……谢谢楼主。
ADF,是所谓的开发框架,它既是平台,也包含组件,它只是AGS的一种开发手段,使用的是基于.NET WebControl的开发方式,其应用组件都是在服务器端生成的。而HTML+JS则相反,是在浏览器端的应用。
LEAF 于 2009-11-2 23:24:00 回复谢谢楼主的回复
Leave a comment
Or, take a look at Archives and Categories
请问,AJAX技术是如何应用再ARCSERVER 上的啊,听说可以提高页面刷新速度??要做个桌面端应用程序吗?