arcgis for server10.3.1中提供了一個新的功能叫作soi。本文簡單的介紹soi概念,實現,在使用過程當中的注意事項。閱讀本文和使用soi須要如下先決條件前端
SOI是ArcGIS Server 10.3.1中新增長的功能。故開發和部署SOI須要安裝ArcObject sdk 10.3.1 和 ArcGIS Server 10.3.1。json
瞭解SOE開發的流程。安全
SOI是server object interceptors的縮寫。從字面意思,是服務對象捕獲器。esri對其的介紹是,用來捕獲觸發地圖服務和影像服務內置操做的請求。服務器
也便是任何調用server服務功能的前端,發送的請求,都能在服務器端被自定義的soi應用程序捕獲到。soi能夠過濾到達的請求,也能夠在response中添加內容返回前端。以下示意圖:
網絡
在網絡開發中,有個常見的功能,就是開發防盜鏈。即在圖片上加logo等水印。在server的出圖操做中,能夠運用soi,捕獲每次export map返回的結果。給結果圖片加上水印。函數
除了這種情形,還有一些,好比,針對圖層和功能級別的控制均可以使用soi。url
定位上,SOE是Server Object Extension 的縮寫,其旨在豐富sever服務器端可以提供的功能。而SOI旨在對每次到達服務器端的請求處理。rest
實現上,兩種的底層的實現原理實際上是同樣的,編寫dll,註冊到服務器端。且二者的開發和部署的方式同樣。安裝了AO sdk 10.3.1的版本,在編輯中,新建項目能夠看到多了一個SOI的模板。code
soi開發編譯完後,也是生成soe文件,在site中部署便可。能夠直接說SOI便是一個SOE的功能子集。在SOE的開發模板中能夠實現soi的這種功能。只不過使用SOE獲取參數的過程,soi直接給你參數變量。具體怎麼實現,這裏就按下不表。orm
SOI支持 如下三種請求的捕捉:
根據請求類型的不同,其須要實現的接口是不同的,上面三種請求類型,對應須要實現的接口以下:
三種都隸屬於命名空間Esri.ArcGIS.esriSystem
須要注意的是,無論你想捕獲的請求是上面的那一種,這三個接口的是必須實現。如你只想捕獲rest請求,可是在模板除了添加IRESTRequestHandler的實現方法,其餘兩個接口的方法也必須實現。 而你在其餘兩個接口方法中,不編寫任何的處理代碼。 看完這段話,也許會感到詫異,爲什麼只須要控制一種請求,而須要實現三種方式,考慮下面的情形:
arcgis server發佈的地圖服務,既經過rest也經過soap對外提供服務能力。若是在開發某一個功能,特別是安全方面的控制的時候,若是隻在rest的實現方式中添加控制代碼而soap中不添加,就soap這端會存在安全漏洞。這個時候的建議就是在三種實現中都處理全部的請求
三種實現方式中,rest是最爲簡單的實現方式。全部的參數都是json的形式。其中有兩個必須實現的方式,其中下面的方法,是須要開發人員處理的:
public byte[] HandleRESTRequest(string capabilities, string resourceName, string operationName, string operationInput, string outputFormat, string requestProperties, ref string responseProperties);
看下這個方法的中的輸入參數名,是否是對soi的實現一目瞭然。在這個方法中,經過對傳遞過來的參數就行判斷,就能夠對請求進行過濾。
那怎麼對輸出,返回到前端的結果進行處理呢?
若是須要對結果進行處理,須要捕獲response。在模板中,上面函數的返回結果就是response。
能夠聲明一個response變量,來接受返回。能夠把模板中的return改成var response
var response = restRequestHandler.HandleRESTRequest( Capabilities, resourceName, operationName, operationInput, outputFormat, requestProperties, out responseProperties);
獲取到response變量後對response的變量進行處理操做。
最後,在該函數的末尾本身,寫一個序列化的函數return回去。能夠參考ESRI.ArcGIS.SoeSupport中關於序列化與反序列化的內容。
開發完了就是部署了。須要注意的是,一個服務只能啓用一個soi。 本人也思索了下這種情形的緣由,由於soi自己沒有增長服務的能力。在rest上,功能經過url提供,麼有功能增長,url就保持不變。一個服務的多個soi的url是徹底同樣。
另外兩種接口的實現的思路差很少,不一樣的是,處理的參數的類型不一樣。如soap的二進制等。
若是有SOE的開發經歷,開發SOI仍是很易上手的。一開始費了勁讀模板中Utilities的實現,其實這部分的內容本身徹底無需瞭解。直接用便可。
更多內容和示例,參考AO的開發幫助。