1.SOE介紹
在ArcGIS 10.1中ArcGIS Server不在支持DCOM方式的連接,這也就意味着我們不能通過本地方式的連接使用ArcObjects提供的更多功能,所以我們推薦一種新的方式來實現這些功能,這種方式就是SOE服務器對象擴展。SOE存在於整個服務對象的生存期內,可以利用服務對象的資源並對其進行擴展。一個SOE通常在服務對象創建是初始化,並且在整個服務對象的生存期內只會被創建一次。SOE支持SOAP和REST兩種訪問方式,其通過強大的AO來擴展服務對象,並可以運行在一個沒有AO的客戶端中。
SOE特別適用於那些使用ArcGIS APIs無法完成的復雜業務邏輯功能。SOE可以提供粗粒度的接口,一次完成復雜的工作,而不是向服務器端發送大量的請求。目前大多數Gis公司都有管網項目,而ArcGIS APIs並沒有為我們提供幾何網絡的有關內容,工程師們大多數通過利用AE在后台完成分析操作,然后返回json格式數據。這樣每個公司可能會有一套自己的函數庫用來完成以上問題,SOE的出現剛好可以用來提供統一的方法來解決這個問題,且其執行速度很快。
SOE比較適合那些有多種平台工作經驗的開發者,開發一個SOE通常會用到AO、.NET或Java、REST或SOAP Web服務通信技術。
2.重要接口
首先我們來介紹幾個必要的接口(REST方式):IServerObjectExtension、IObjectConstruct(可選)、IRESTQuestHandler
IServerObjectExtension接口主要由兩個方法:
Init---該函數有一個IServerObjectHelper類型的參數。該函數在服務啟動時被調用,並將IServerObjectHelper對象傳入,此接口是對Server對象弱引用,可以通過其ServerObject屬性得到Server對象。
Shutdown---該方法用在服務器關閉時調用,經常我們在該方法中釋放SOE中使用的資源。
IObjectConstruct只有一個方法:Construct();該方法在Init方法執行后立即執行,該方法也只會執行一次,通常用來配置SOE屬性,也可以將比較耗費資源的邏輯放在這個方法中。比如獲取地圖代碼,或者獲取一個每次請求都會被操作的圖層。
IRESTQuestHandler接口主要有以下兩個方法:
GetSchema() ---以JSON格式返回SOE的資源列表
HandleRESTREquest() 方法主要有兩個作用:回調資源和操作的方法、獲取資源在實例級別的描述。該方法在識別這兩個作用的時候是通過operationName參數,如果該參數是空字符產那就是第二個作用,否則是第一個作用。
該方法的參數如下:
(1).String capabilities:一組被資源授權的操作,可以為空字符串
(2).String resourceName: 資源名稱. 空字符串表示根級別,子資源會通過‘/’ 表示
(3).String operationName: 操作名稱
(4).String operationInput: 操作的參數,JSON格式
(5).String outputFormat:客戶端請求的輸出格式,如JSON,AMF
(6).String[] responseProperties: 通過操作返回的一組鍵值對,逗號分開
3.大致流程
(1)編寫代碼。通常使用ESRI提供的REST SOE模板
(2)在每台SOC機器上注冊SOE COM組件
(3)將SOE注冊到ArcGISServer中
(4)為ArcCatalog或者Manager編寫並部署一個屬性頁(可選)
(5)在Server中啟動SOE,並測試