ArcGIS Server可以通過Local和Internet兩種方式串連,Local串連是在客服端利用AO串連到SOM的,而Internet串連是在客服端利用本地代理串連到Web service端,本地代理是指在本地開發環境(.net,java)中獨立管理的對象。
Local方式的串連提供了利用AO API和SOAP API操作services,即server objects和server context,如果需要永久改變server object的狀態(stateful)只能利用AO API,當然也就需要使用Local方式串連,Local串連需要提供server機器名和需要串連的service服務名,並且此串連必須利用agsusers或agsadmin組中的使用者添加Identity驗證;Local data sources使開發人員可以通過server context操作細粒AO,即可以在Web ADF application中使用豐富的AO功能,例如編輯圖層、網路分析等。如果以編程方式使用Local data source,利用資料資產庫ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer,通過類MapFunctionality可以得到map description;而MapResourceLocal也可以通過ServerContextInfo.ServerContext得到context。
Internet方式串連僅提供利用SOAP API以通過WSDL來訪問和操作services的能力,而所有的service也是無狀態的。對Internet data source來說context是無效的,當然也沒有細粒AO的功能,此種串連Indentity驗證不是必須的,因為ArcGIS Server Web services可以使用基於web server的驗證,即在一個web application中多個internet資料來源可以採用各自不同的安全驗證方式。對Internet方式已連線的服務推崇使用pool類型,而non-pool類型只對單個使用者服務,並且每次用完後都得顯示的進行銷毀。如果以internet方式串連並使用non-pool類型服務,每一次地圖操作過程都會建立和銷毀一個進程,這樣將大大影響你的工作效率。如果以編程方式使用Internet data source,利用資料資產庫ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer,此庫中包含functionality類和其他一些用於在無狀態下使用的細粒任務類。
總之,客服端串連server的方式可以按如下規則選取:
1、Internet串連方式使用soap api並且利用url串連到web service端,internet串連可以運用到internal(LAN)和internet網。
2、Local串連方式即可利用AO API也可以利用SOAP API,根據客服端的需要,而Local串連僅能用於區域網路內。
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中提到。