[转]池化和非池化地图服务的区别
下面的小示例来体验一下池化和非池化地图服务的区别。步骤如下:
1,发布一个地图服务,选择作为Pooled服务,其它设置默认,这里假设服务名称world。该地图服务包括两个图层,一个是世界影像数据图层,另一个是世界大洲的矢量数据图层。
2,在VS 2005中创建一个站点。向Default.aspx页面中添加Map控件和MapResourceManager控件,并且使用world服务。向页面中添加一个asp.net的web服务器控件Button,标题改为delete layer。
3,向delete layer按钮的Click事件添加处理方法。首先使用具有agsadmin权限的用户连接arcgis server,然后创建servercontext,获取IMap接口,删除一个图层,释放servercontext。代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
ESRI.ArcGIS.ADF.Identity identity = new ESRI.ArcGIS.ADF.Identity("user", "password", "hostname");
ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection agsconnection;
agsconnection = new ESRI.ArcGIS.ADF.Connection.AGS.AGSServerConnection("hostname", identity);
agsconnection.Connect();
IServerObjectManager som = agsconnection.ServerObjectManager;
IServerContext serverContext = som.CreateServerContext("world", "MapServer");
IMapServer mapServer = serverContext.ServerObject as IMapServer;
IMapServerObjects mapServerObjects = mapServer as IMapServerObjects;
IMap map = mapServerObjects.get_Map(mapServer.DefaultMapName);
map.DeleteLayer(map.get_Layer(0));
mapServerObjects.RefreshServerObjects();
serverContext.ReleaseContext();
}
4,在IE中浏览页面,效果如下。
5,同时在ArcCatalog中预览world服务,效果如下。
6,点击delete layer按钮后,大洲的矢量图层被删除,只留下影像图层,效果如下。
7,同时在ArcCatalog中预览world服务,效果如下,可以发现和浏览器中的效果一样,也是只有影像图层,没有矢量的图层。这是Pooled服务的效果,因为在浏览器中删除的图层时使用的服务器对象并没有被销毁,然后被ArcCatalog使用,这样在IE中的操作就影响了其它用户的地图状态。
Not Pooled
8,在ArcCatalog中把world服务修改为Not pooled,如下图所示。
9,把delete layer按钮的Click事件处理方法修改为如下代码:
protected void Button1_Click(object sender, EventArgs e)
{
ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality agsMapFunctionality =
(ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality)Map1.GetFunctionality(0);
MapResourceLocal m_AGSLocalMapResource = (MapResourceLocal)agsMapFunctionality.Resource;
IServerContext serverContext = m_AGSLocalMapResource.ServerContextInfo.ServerContext;
IMapServer mapServer = serverContext.ServerObject as IMapServer;
IMapServerObjects mapServerObjects = mapServer as IMapServerObjects;
IMap map = mapServerObjects.get_Map(mapServer.DefaultMapName);
map.DeleteLayer(map.get_Layer(0));
mapServerObjects.RefreshServerObjects();
}
10, 在IE中浏览页面,效果如下。
11,同时在ArcCatalog中预览world服务,效果如下。
12,点击delete layer按钮后,大洲的矢量图层被删除,只留下影像图层,效果如下。
13,同时在ArcCatalog中预览world服务,效果如下,可以发现和浏览器中的效果不一样,影像图层和矢量图层都存在。这是NotPooled服务的效果,ArcCatalog和浏览器查看地图时使用的并不是同一个serverobject,所以彼此之间没有产生干扰。
Pooled和Not Pooled各有优势,从我们的示例上看Pooled服务性能更好一些,但是,Not Pooled服务可以维护状态,尤其是在数据编辑的功能实现时使用。