SOE開發概覽
一個SOE就是一個元件物件模型(COM),其由.Net或Java實現了IServerObjectExtension 介面和一些其他必須實現的介面。服務例項(也可稱作“伺服器物件”)建立了SOE並呼叫了Init方法,通過server object helper引數可以將SOE作為一個伺服器物件引用來處理。SOE可以在伺服器物件上呼叫方法。
所有SOE使用的介面(IServerObjectExtension和IObjectConstruct)
必需的IServerObjectExtension介面包括如下的方法。這個介面被伺服器物件用來管理SOE的生命週期。
Shutdown—通知SOE伺服器物件將要關閉。作為相應,SOE釋放它對server object helper的引用。
如果你的SOE包括配置屬性或者需要初始胡邏輯,那麼就需要實現可選的介面IObjectConstruct。這個介面僅包含一個方法Construct,該方法在IServerObjectExtension.Init之後呼叫。Construct將以屬性集的形式返回SOE的配置屬性。
不要把初始化的邏輯放在SOE類的建構函式或Init函式中,應該將其放到IObjectConstruct.Construct()方法中,該方法在SOE的生命週期中稍後呼叫。這確保了你已經完全建立了SOE,並可以用你的初始化邏輯記錄任何的錯誤。
因為SOE是Web服務,它使用請求處理介面(request handler interface)來完成工作,使用ESRI.ArcGIS.SOESupport.ServerLogger物件進行日誌記錄。
基於REST的SOE Web服務實現了IRESTRequestHandler介面。
基於SOAP的SOE Web服務實現了IRequestHandler2介面。
有可能建立一個同時實現了IRESTRequestHanler和IRequestHandler2介面的SOE以便能同時支援REST和SOAP兩種方式。
當使用SOE的時候,客戶端對Web服務傳送HTTP請求,該Web服務會返回響應結果。請求處理介面(request handler interface)有助於完成這個通訊過程。
當你開發一個SOE的時候,其實你就是在開發一個能夠接收請求並能返回結果的Web服務。SOE被ArcGIS Server暴露成Web服務,這種方式與其他原生服務(比如map或geocode服務)被暴露的方式是相同的。SOE在GIS伺服器中有效執行,通過呼叫ArcObjects以實現必要的地理空間分析功能。SOE可以影響ArcGIS Server的管理和安全框架,比如通過使用ArcGIS Server 令牌(token)服務模型來確保獲取SOE Web服務的安全性。
你可以用C#或Java開發SOE,其可以支援REST或SOAP或二者均支援。本節餘下的內容描述瞭如何用.Net構建REST和SOAP的Web服務。
在Visual Studio中,ArcGIS提供了REST和SOAP模板。這些模板為你提供了建立SOE所必需的程式碼。你用這些模板建立SOE,然後修改已經存在的程式碼,並加入SOE必須得邏輯。
REST SOE模板應用程式是由一個類組成的,該類實現了REST SOE所必需的所有的介面,包括IServerObjectExtension、IObjectConstruct以及IRESTRequestHandler。更多REST SOE類的實現請參見 Developing REST server object extensions.
SOAP SOE模板應用程式是由一個類組成的,該類實現了SOAP SOE所必需的所有的介面,包括IServerObjectExtension、IObjectConstruct以及IRequestHandler2。在這個結構中另外一個元件就是一個模板Web服務描述語言(WSDL)檔案,你可以通過它將Esri的SOAP型別整合進你自己的SOAP實現。更多SOAP SOE類的實現請參見Developing SOAP server object extensions。
ArcGIS Server服務代表了託管在GIS伺服器容器程式中的“伺服器物件”(server objects)。伺服器物件包含了與其相關聯的預先打包的功能;因此,地圖伺服器物件(map server objects)託管了地圖資料、產生地圖圖片、處理查詢;地理編碼伺服器物件(geocode server objects)託管了一個能夠將位置轉換為地址的定位器,諸如此類。
在自定義的工作流中,通過使用已經存在的伺服器物件(server objects)擴充套件了這種功能。SOEs中一個或多個公共的方法(public method)提供了訪問該工作流的許可權。
客戶端知道如何通過標準的協議使用SOE,比如用WSDL使用SOAP服務,用JSON使用REST服務。客戶端通過HTTP協議對ArcGIS Server Web服務例項傳送請求。這個Web服務例項包含了SOAP和REST請求處理函式以便將這個請求轉接到託管在伺服器物件(server object)中的SOE上,伺服器物件是放在GIS伺服器上的。然後SOE對請求進行反序列化,執行業務邏輯(通常要獲取伺服器物件)並對返回結果進行序列化。返回結果通過同一個HTTP通道進行傳送到客戶端,並進行反序列化。
ArcGIS for Server是建立在ArcObjects COM架構上的。基於.Net的SOE類必須可以讓ArcGIS Server通過COM可見和訪問。這是通過ComVisible和GUID這兩個attributes來實現的。ClassInterfaceType.None這個attribute告知型別類庫產生工具一個預設的類介面不需要被建立。SOE模板也告訴你如何使用其他的attributes定義能力(capabilities)、屬性、描述以及支援的Web服務的架構(SOAP和REST)。
下面的示例程式碼顯示了一個簡單SOE的宣告:
[C#]
[ComVisible(true)][Guid("b210df6d-83af-4e02-bf34-db72387a8257")][ClassInterface
(ClassInterfaceType.None)][ServerObjectExtension("MapServer", AllCapabilities =
"", DefaultCapabilities = "", Description = "A simple REST SOE", DisplayName =
"RestSOE", Properties = "", SupportsREST = true, SupportsSOAP = false)]
public class RestSOE: IServerObjectExtension, IObjectConstruct, IRESTRequestHandler
{
. . .
}
[VB.NET]
<ComVisible(True), Guid("2ea26d5b-d1de-4d9e-a1ca-25e3a3cd3d4e"), ClassInterface(ClassInterfaceType.None)> _
<ServerObjectExtension("MapServer", AllCapabilities
= "", DefaultCapabilities
= "", _
Description
= "A simple REST SOE", DisplayName
= "RestSOE", _
Properties
= "", SupportsREST
= True, SupportsSOAP
= False)>
Public Class RestSOE
. . .
End Class
SOE 能力(capabilities)
SOE方法可以按照“能力”(capabilities)進行分組。每個capabilities通過一個對應的配置原則進行授權。對SOE的每個呼叫都包括了capabilities配置資訊以及被呼叫的操作方法。SOE應該檢查capabilities以便於判斷某個方法是否該執行。比如,假設一個SOE有三個方法:M1、M2、M3和兩個capabilities:C1(包含方法M1,M2)和C2(包含M1,M2,M3)。當在一個伺服器物件上啟用了SOE之後,配置資訊僅僅啟用了C1的capabilities。這樣,就不能呼叫SOE上的M3方法。
將方法按照capabilities進行分組不是必須的。
ESRI.ArcGIS.SOESupport 庫
ArcGIS for Server包括了一個.Net庫ESRI.ArcGIS.SOESupport,以便開發者在SOE的開發過程中定義SOAP和REST內容。這個庫包含了固定的程式碼,這些程式碼用於對訊息進行序列化與反序列化、對業務邏輯程式碼的呼叫、錯誤處理以及日誌記錄。總之,模板程式碼從實現類(對於REST是SoeRestImpl類,對於SOAP是SoeSoapImpl類)開始,該類用於組織管理SOE的功能,以及對SOE中的方法進行呼叫。這個庫的使用的討論可分別參見SOAP和REST章節。
日誌記錄
你可以在SOE中通過SOESupport.ServerLogger類將資訊寫入到ArcGIS Server日誌中。在你的SOE建構函式中,你可以建立這個日誌管理器。示例程式碼如下所示:
[C#]
logger = new ServerLogger();
[VB.NET]
logger = New ServerLogger()
你可以用SOE寫入各種等級的資訊。如下所示,8000是一個開發者用SOE自定義的日誌碼。
[C#]
logger.LogMessage(ServerLogger.msgType.infoStandard, "Shutdown", 8000,
"Custom message: Shutting down the SOE");
[VB.NET]
logger.LogMessage(ServerLogger.msgType.infoStandard, "Shutdown", 8000, "Custom message: Shutting down the SOE")
訊息的等級可以通過ServerLogger.msgType獲取,其與ArcGIS Server日誌資訊的等級對應如下:
ServerLogger.msgType | ArcGIS Server log level |
error | Severe |
warning | Warning |
infoSimple | Info |
infoStandard | Fine |
infoDetailed | Verbose |
debug | Debug |
支援REST和SOAP介面
如果你想將你的SOE功能通過SOAP和REST的方式暴露出來,你有如下兩個選擇:
a. 分別用SOAP和REST的模板建立SOEs。儘管這種方式更直接,但是這需要你將兩個SOE設定為不同的名字。
b. 在同一個SOE中實現IRestHandler2和IRESTRequestHandler介面。實現這種方法的一個辦法是使用SOAP模板,然後把REST模板中IRESTRequestHandler的實現程式碼拷貝到SOAP模板中,為了減少程式碼冗餘,應該將你的業務邏輯程式碼封裝到一個單獨的類中,然後通過REST和SOAP的請求處理函式對其進行呼叫。
執行緒
SOE應該能在SOE的主執行緒中建立和獲取ArcObjects。不與ArcObjects進行互動的第三方庫應該執行在其他的執行緒上。只有當他們在同一個執行緒中建立和銷燬的時候,才能在新衍生的執行緒中使用ArcObjects。
相關文章
- REST SOE模板概覽REST
- iOS開發系列--IOS程式開發概覽iOS
- iOS開發除錯 LLDB使用概覽iOS除錯LLDB
- ABAP開發工具及技術概覽(轉)
- 開發和部署SOE的步驟
- 概覽
- 併發程式設計概覽程式設計
- .NET企業應用安全開發動向-概覽
- iOS開發系列—Objective-C之基礎概覽iOSObject
- Solon Cloud 分散式開發套件清單與快速概覽Cloud分散式套件
- 智慧小程式開發生態概覽及接入全流程
- Oracle閃回技術 概覽 應用程式開發功能Oracle
- 機器學習概覽機器學習
- 瀏覽器端技術體系概覽 -- 前端開發的七種武器瀏覽器前端
- 如何使用ABP進行軟體開發之基礎概覽
- Babel 社群概覽Babel
- Hooks概覽(譯)Hook
- 推理框架概覽框架
- Flutter框架概覽Flutter框架
- Java NIO 概覽Java
- 學習概覽
- IT專案概覽
- PyQt5 概覽QT
- Dart語言概覽Dart
- React Hooks-概覽ReactHook
- Flutter技術概覽Flutter
- HTTP報文 概覽HTTP
- Redis分散式概覽Redis分散式
- BIO,NIO,AIO概覽AI
- Vuex - 原始碼概覽Vue原始碼
- 概覽【JavaScript那些事】JavaScript
- 編譯原理概覽編譯原理
- Goolge AppEngine概覽GoAPP
- redis基本操作概覽Redis
- 設計模式概覽設計模式
- Java併發程式設計知識概覽(一)Java程式設計
- 全球隱私計算技術發展概覽
- Python 基礎概覽Python