ArcGIS Server学习5

Posted by 蒋波涛 26 June,2007 Views (7)Comment

有状态和无状态的应用程序2

我们继续讨论web程序的状态问题。其实写过诸如asp jsp的人都知道,类似session、cookie等东西在web页面程序中应用的非常广泛,因为这是我们让程序记住一个用户标志的方法,唯有使用这些对象,我们才能区分不同的用户。

事实上,有状态的web程序是极其常见的,许多我们根本没有意识到的“无状态”操作都依赖有状态的方法来实现,这种方法我们称为“浅状态程序”,例如下面这个例子,我们启动一个页面,然后点击一个“固定放大”按钮去放大地图,看起来似乎与状态无关,但是仔细想想,这种固定放大是依赖地图放大前一次的范围的,这意味着我们必须记录前一次的地图状态,这其实就是一种状态程序。

我们下面写这个代码:

页面启动:
  private void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
   if(!Page.IsPostBack)
   {
    if(Session.IsNewSession)
    {
     ESRI.ArcGIS.Server.WebControls.ServerConnection pServerConn=new ESRI.ArcGIS.Server.WebControls.ServerConnection("nbjbt");
     pServerConn.Connect();
     IServerObjectManager pSOM=pServerConn.ServerObjectManager;
     //将SOM保存到全局变量区
     Application.Set("som",pSOM);

     IServerContext pSC=pSOM.CreateServerContext("nbserver","MapServer");
     IServerObject pSO=pSC.ServerObject;
     IMapServer pMapServer=(IMapServer)pSO;
     IMapServerInfo pMapServerInfo=pMapServer.GetServerInfo(pMapServer.DefaultMapName);
     IMapDescription pMapDesc=pMapServerInfo.DefaultMapDescription;
     //将pMapDesc序列化为一个字符串,保存到一个session中
     string ss=pSC.SaveObject(pMapDesc);
     Session["md"]=ss;
     //显示启动时默认地图
     this.Image1.ImageUrl=this.CreateImage(pMapDesc,pSC);
     //释放进程
     pSC.ReleaseContext();
    }
   }
  }

下面是按下固定放大时候的代码:
  private void Button1_Click(object sender, System.EventArgs e)
  {
   IServerObjectManager pSom=(IServerObjectManager)Application.Get("som");
   IServerContext pSC=pSom.CreateServerContext("nbserver","MapServer");
   IMapServer pMapServer=(IMapServer)pSC.ServerObject;
   //从session中取出上一次地图的描述对象
   string smd=(string)Session["md"];
   IMapDescription pMapDesc=(IMapDescription)pSC.LoadObject(smd);

   IMapArea ma=pMapDesc.MapArea;
   IEnvelope pEnv=ma.Extent;
   pEnv.Expand(0.9,0.9,true);

   IMapExtent mx=(IMapExtent)ma;
   mx.Extent =pEnv;
   pMapDesc.MapArea =ma;
   //改变地图
   this.Image1.ImageUrl=this.CreateImage(pMapDesc,pSC);
   //将改变后的地图描述对象存入同名的session中
   string ss=pSC.SaveObject(pMapDesc);
   Session["md"]=ss;
   pSC.ReleaseContext();
  }

有“浅状态程序”,也就有相应的“深状态程序”了,后者必须是一种独占式的SO才行,因为深状态程序做的内容可能包括删除地图中的一个图层等操作,如果是非独占式的SO,显然不行,这就是说我们在深状态程序中,必须使用非池化SO才行。

最后还需要记住的一点是,如果访问非共享池模式的SO时产生了session,需要在Session_End事件中手工将这些session清除,这是因为服务器的空间和性能是有限的,产生太多的session会对服务器的性能有影响,而且对于非共享池模式的session而言,反正是独占式享用SO,在退出时保留session是浪费资源而已。

Related Items

Categories : ArcGIS Server Tags : ArcGIS  Server  
Comments
2007-6-26 14:45:39

版主,请教下如何用arcgis实现污染源扩散模型,随着我输入的时间 风向和风速的变化,污染源的扩散范围在变化 谢谢

Posted by wzf Gravatar Icon

2007-6-26 22:40:48

不好意思,我没有做过环境方面的专业模型,也不熟悉这方面的知识。

Posted by 蒋波涛 Gravatar Icon

2007-6-30 16:51:05

请教下 可以在arcgis里 做一个爆炸动画的 效果不 谢谢

Posted by wzf Gravatar Icon

2007-8-13 22:56:08

你的博客内容很精彩,以后我会常常来拜读!
顺便给你推荐一个专业的礼品网站http://www.dawanginfo.com,希望你喜欢!谢谢!

Posted by 人生几何 Gravatar Icon

2007-9-13 15:11:52

能不能谈谈ArcSERVER的关键算法阿

Posted by PP Gravatar Icon

2007-9-13 15:14:33

能不能谈谈Arcserver的共享模式,技术路线和它的关键算法阿
主要是体现它的共享优势的关键算法

Posted by PP Gravatar Icon

2007-9-13 22:40:37

我们都是二次开发者,这关键算法啥的,不可能知道的。

Posted by 蒋波涛 Gravatar Icon

Leave a comment

Or, take a look at Archives and Categories

目录

存档