ArcGIS Server学习4

June 25, 2007 | tags ArcGIS  Server   | views 1554 <script type="text/javascript"></script>

Comments 1

在前文中我们说道,Server Object实际上就是我们建立的地图服务和定位服务,这个服务都是必须通过一个进程来被请求访问到的,那么,这个过程是怎么样的呢?下面我们介绍在共享池模式下的连接过程:

  1. 客户端程序连接到SOM,要求访问一个SO;
  2. SOM分配一个SOC给客户端程序的AO Proxy对象,这个SOC是AS启动时建立的,默认最少为2个,最多为4个;
  3. 客户端程序通过调用远程AO对象的Proxy对象操作AO对象;
  4. 执行完操作后。执行pSC.ReleaseContext,SOC返回共享池中,等待下一次请求访问。

如果是非共享池模式,这个过程不同在于:

  1. SOM新建一个SOC给代理对象
  2. 执行执行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的图片。

 

原文地址:http://www.hmgis.cn/post/243.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值