June 25, 2007 | tags ArcGIS Server | views 1554 <script type="text/javascript"></script>
在前文中我们说道,Server Object实际上就是我们建立的地图服务和定位服务,这个服务都是必须通过一个进程来被请求访问到的,那么,这个过程是怎么样的呢?下面我们介绍在共享池模式下的连接过程:
- 客户端程序连接到SOM,要求访问一个SO;
- SOM分配一个SOC给客户端程序的AO Proxy对象,这个SOC是AS启动时建立的,默认最少为2个,最多为4个;
- 客户端程序通过调用远程AO对象的Proxy对象操作AO对象;
- 执行完操作后。执行pSC.ReleaseContext,SOC返回共享池中,等待下一次请求访问。
如果是非共享池模式,这个过程不同在于:
- SOM新建一个SOC给代理对象
- 执行执行pSC.ReleaseContext后,SOC被销毁而不是返回到共享池中。
有状态和无状态的GIS应用程序
我们知道,一个web程序在每个用户访问的时候,都会产生一个session来记录访客的信息,如果所有用户的访问与session的状态无关,则我们认为这个程序是无状态的,否则就是有状态。例如my google这些站点,每个人登录后的信息都是不同的,我们则认为这是一个有状态的程序。
对于AS的Server Object而言,状态state也是非常重要的。一个SO如果是有状态的,那么它的属性就能改变,否则,非状态的SO的属性是不能被修改的。一个SO的状态如何暗示了它是否能够被跨session共享使用。如果一个SO是无状态的,那么它就是共享的,否则就是独占式的。
SO是否使用状态与SO是否是共享池模式有密切个关系。这是因为,一个池式的SO是不能被改变的,不能被用于有状态的程序中;一个非池式的SO的属性是能够改变的,它能够用于有状态的程序中。一个池式的Server Object是默认为无状态使用的,这是因为这个SO可能会给多个用户访问,而且它用完后是会放回共享池中的,如果改变了它的状态,则意味着不同的访问者访问它时获得的信息不一致,这本身是一种非状态的行为。而我们要求的是保证不同的人都是一样的结果的一种无状态模式,因此,保证本身具有“共享”特征的池式SO的无状态使用才是到达目的的方法。因此,共享池模式的SO的无状态使用,是有效率满足访问的方式。如果要做无模式的程序,共享池式的SO是首选。
如果是建立有模式的程序,那么使用非共享池式的SO是首选,由于这种情况下访问请求与SO数量是1:1,这就使得一个人对SO的改变不会影响另一个人的使用。
下面是一个无状态的代码:
ServerConnection pServerConn=new ESRI.ArcGIS.Server.WebControls.ServerConnection("nbjbt");
pServerConn.Connect();
IServerObjectManager pSOM=pServerConn.ServerObjectManager;
IServerContext pSC=pSOM.CreateServerContext("nbserver","MapServer");
IServerObject pSO=pSC.ServerObject;
IMapServer pMapServer=(IMapServer)pSO;
IMapServerInfo pMapServerInfo=pMapServer.GetServerInfo(pMapServer.DefaultMapName);
IMapDescription pMapDesc=pMapServerInfo.DefaultMapDescription;
IImageType it=(IImageType)pSC.CreateObject("esriCarto.ImageType");
it.Format =esriImageFormat.esriImageJPG;
it.ReturnType =esriImageReturnType.esriImageReturnURL;
IImageDisplay idisp=(IImageDisplay)pSC.CreateObject("esriCarto.ImageDisplay");
idisp.Height =400;
idisp.Width =400;
idisp.DeviceResolution=150;
IImageDescription pID=(IImageDescription)pSC.CreateObject("esriCarto.ImageDescription");
pID.Display =idisp;
pID.Type =it;
IImageResult pImgResult=pMapServer.ExportMapImage(pMapDesc,pID);
this.Label1.Text =pImgResult.URL;
pSC.ReleaseContext();
代码执行完毕后,在Label1中将出现一张图片的地址,我们在AS服务器的输出目录看看,会发现已经生成了一张JPG的图片。