段建剛
(吉林省水利水電勘測設(shè)計研究院,吉林 長春 130012)
多年的測繪工作積累了大量的成果資料,有紙質(zhì)的各種圖(表)、電子數(shù)據(jù)光盤等等。由于資料數(shù)量多、存儲分散,想要查找利用已有的成果就會變得非常困難,而且經(jīng)年累月,數(shù)據(jù)量還在不停地增長。隨著地理信息技術(shù)及網(wǎng)絡(luò)技術(shù)的發(fā)展,需要開發(fā)一個基于局域網(wǎng)測繪成果資料管理系統(tǒng)?;赟ilverlight富客戶端技術(shù)、WCF數(shù)據(jù)服務(wù)技術(shù)、Web GIS技術(shù)和數(shù)據(jù)庫技術(shù)來構(gòu)建本系統(tǒng)框架,下面以此成果管理系統(tǒng)為例詳細剖析基于Silverlight富客戶端技術(shù)和WCF數(shù)據(jù)服務(wù)技術(shù)Web GIS框架的構(gòu)建。
傳統(tǒng)的Web GIS框架一般采用B/S模式或C/S模式[1]。B/S模式由客戶端向服務(wù)器發(fā)起數(shù)據(jù)請求,服務(wù)器根據(jù)用戶請求完成全部的數(shù)據(jù)計算,然后將結(jié)果發(fā)送給瀏覽器顯示;C/S模式由客戶端向服務(wù)器發(fā)起數(shù)據(jù)請求,服務(wù)器根據(jù)用戶請求完成數(shù)據(jù)計算,然后將數(shù)據(jù)發(fā)送給客戶端,客戶端對中間數(shù)據(jù)進行再加工,然后將最終結(jié)果顯示給用戶[2]。B/S架構(gòu)的技術(shù)瓶頸都集中在服務(wù)器端,這樣會造成服務(wù)器的計算壓力過大,影響服務(wù)器并發(fā)量和用戶體驗;C/S架構(gòu)稍好,客戶端能夠適當(dāng)分擔(dān)一部分服務(wù)器端的計算壓力,用戶體驗較好。B/S架構(gòu)的優(yōu)點是客戶端為瀏覽器,無需另外安裝客戶端,系統(tǒng)升級時只需升級服務(wù)器端即可完成系統(tǒng)的升級,而C/S架構(gòu)需要另外安裝客戶端軟件,系統(tǒng)升級時需要將服務(wù)器端和客戶端都升級才能更好地協(xié)同工作。鑒于此,便有了基于瀏覽器的富客戶端技術(shù),Silverlight技術(shù)就是一種微軟發(fā)布的基于瀏覽器的富客戶端技術(shù),它以瀏覽器插件的形式工作和更新的,是B/S架構(gòu)和C/S架構(gòu)二者優(yōu)點相結(jié)合的產(chǎn)物,插件安裝后就可以利用客戶端的計算能力了[3]。
數(shù)據(jù)庫能向用戶提供高效的數(shù)據(jù)存儲、管理、檢索、備份、恢復(fù)等功能,所以本系統(tǒng)框架會使用數(shù)據(jù)庫平臺來管理數(shù)據(jù),以數(shù)據(jù)庫檢索作為管理資料的屬性檢索技術(shù)支持,以GIS空間檢索作為框架平臺的空間檢索技術(shù)支持。將成果資料存放在網(wǎng)站服務(wù)器目錄中,提取每項成果資料的元數(shù)據(jù)(成果資料的基本信息),將元數(shù)據(jù)存放在數(shù)據(jù)庫中,并建立字段索引,方便在檢索的時候可以快速通過元數(shù)據(jù)檢索到成果資料本身。
由于服務(wù)器端是不允許客戶端直接操作服務(wù)器數(shù)據(jù)庫數(shù)據(jù)的,而寄宿在服務(wù)器端的Web服務(wù)是可以操作服務(wù)器數(shù)據(jù)庫數(shù)據(jù)的,所以客戶端需要通過Web服務(wù)這個橋梁來間接完成對服務(wù)器數(shù)據(jù)庫數(shù)據(jù)的操作[4]。Web服務(wù)通過服務(wù)器向客戶端公開交互接口,這樣客戶端就能連接到并使用這個Web服務(wù)了??蛻舳讼蚍?wù)器發(fā)送請求,然后服務(wù)器將請求交給Web服務(wù)去處理,Web服務(wù)按照請求檢索數(shù)據(jù)庫,并通過服務(wù)器將結(jié)果發(fā)送回客戶端。Silverlight客戶端根據(jù)用戶需求定制功能模塊[5],主要有瀏覽功能模塊、用戶管理模塊、成果資料管理模塊。用戶通過操作這些功能模塊與服務(wù)器交互。
從上面的分析可以很明顯地看出本架構(gòu)是一個典型的3層架構(gòu)GIS應(yīng)用系統(tǒng)。第1層為基礎(chǔ)數(shù)據(jù)庫層,第2層為Web數(shù)據(jù)服務(wù),第3層為GIS應(yīng)用層。
本系統(tǒng)框架是一個基于數(shù)據(jù)庫的Web GIS系統(tǒng)框架,主要功能模塊有瀏覽功能模塊、用戶管理模塊、成果資料管理模塊三大模塊。瀏覽功能模塊包括縮放、平移、選取、圖層管理、選擇,用戶管理模塊包括用戶管理、用戶角色管理、用戶權(quán)限管理,成果資料管理模塊包括成果資料上傳、歸檔、查詢、修改、下載。由于本框架的基礎(chǔ)數(shù)據(jù)庫存儲的是成果資料的元數(shù)據(jù),所以數(shù)據(jù)量較小,側(cè)重點是檢索效率及數(shù)據(jù)安全,所以采用目前最流行的SQL Server 2008 Express版作為本框架的數(shù)據(jù)庫平臺。Web服務(wù)是多種多樣的,最常用的有基于.NET平臺的Web Service、WCF等,在本框架使用WCF數(shù)據(jù)服務(wù)作為通信紐帶。采用ASP網(wǎng)站作為服務(wù)器端,使用該網(wǎng)站來承載WCF服務(wù)??蛻舳藶榛贏rcGIS API for Silverlight開發(fā)的富客戶度瀏覽器應(yīng)用程序。本系統(tǒng)的詳細架構(gòu)如圖1所示。
圖1 框架詳細架構(gòu)圖
SQL Server數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫,采用表格和記錄的方式來管理數(shù)據(jù)。本框架系統(tǒng)的基礎(chǔ)數(shù)據(jù)庫包含兩個庫:用戶管理庫、成果資料庫。用戶管理庫存儲用戶基本信息和用戶角色信息、權(quán)限信息等,各個數(shù)據(jù)表的結(jié)構(gòu)及關(guān)系如圖2所示;成果資料庫存儲成果資料的元數(shù)據(jù)信息,成果資料元數(shù)據(jù)抽象信息及各表關(guān)系如圖3所示。
圖2 用戶管理庫“用戶-角色-權(quán)限”關(guān)系圖
圖3 成果資料庫表格關(guān)系圖
SQL Server所使用的數(shù)據(jù)庫查詢語言TransactSQL是SQL Server的核心,可以使用TransactSQL編寫功能強大的存儲過程,存儲過程存放在服務(wù)器端,并且預(yù)先編譯過,執(zhí)行速度非常塊[6]。創(chuàng)建了插入、修改和查詢等存儲過程,通過觸發(fā)這些存儲過程來控制相關(guān)表格中的數(shù)據(jù)操作。
由于服務(wù)器是不允許客戶端直接操作服務(wù)器端數(shù)據(jù)庫數(shù)據(jù)的,而寄宿在服務(wù)器端網(wǎng)站的WCF服務(wù)可以直接操作服務(wù)器的數(shù)據(jù)庫,所以客戶端必須通過訪問WCF服務(wù)來間接達到操作服務(wù)器數(shù)據(jù)庫的目的。因為本框架服務(wù)器端的ASP網(wǎng)站不向客戶端發(fā)送任何實時生成的網(wǎng)頁,只是作為一個數(shù)據(jù)服務(wù)器而存在,即作為WCF數(shù)據(jù)服務(wù)的一個宿主網(wǎng)站,所以服務(wù)器端設(shè)計其實主要是該網(wǎng)站承載的WCF服務(wù)的設(shè)計。
WCF服務(wù)利用契約將服務(wù)和服務(wù)的操作定義為一個整體,以解釋通過網(wǎng)絡(luò)傳遞的數(shù)據(jù)。契約用來定義數(shù)據(jù)類型、操作、消息交換模式和消息交換使用的傳輸協(xié)議,契約提供了服務(wù)通信所必需的元數(shù)據(jù),契約通常使用與程序語言無關(guān)的XML格式發(fā)布的。WCF有三類契約:服務(wù)契約、數(shù)據(jù)契約、錯誤契約和消息契約[7]。
服務(wù)契約定義了WCF服務(wù)向外界公開的功能,這些功能表現(xiàn)為服務(wù)操作(Service Operation)。通常,需要把一個或多個參數(shù)傳遞給一個服務(wù)操作,并等待服務(wù)操作返回一個值。數(shù)據(jù)契約定義了客戶端與服務(wù)之間信息交換的結(jié)構(gòu)和內(nèi)容。如果需要使用自定義對象或復(fù)雜數(shù)據(jù)類型作為服務(wù)操作的參數(shù)或返回值,則必須向運行時提供信息,告知如何用DataContract特性把這些類型序列化為XML流。
本系統(tǒng)框架有3個功能模塊,由于瀏覽模塊的功能只與客戶端顯示的當(dāng)前數(shù)據(jù)有關(guān),無需與服務(wù)器端數(shù)據(jù)進行通信,所以該模塊的設(shè)計放在Silverlight客戶端,因此只需設(shè)計2個WCF數(shù)據(jù)服務(wù):用戶管理服務(wù)、成果管理服務(wù)即可,服務(wù)的接口設(shè)計應(yīng)能滿足客戶端的相應(yīng)功能模塊設(shè)計為宜。
創(chuàng)建一個命名為UserWcfService的啟動了Silverlight功能的WCF服務(wù),該服務(wù)即為用戶管理服務(wù),該服務(wù)定義了“注冊新用戶”、“登錄系統(tǒng)”、“修改用戶信息”等操作,其服務(wù)契約定義如下。很明顯,該服務(wù)的操作方法的參數(shù)和返回值中用到了兩個自定義對象類型:UserInfo、UserRole,其中UserInfo對象為包含用戶基本信息的對象類型,UserRole為包含用戶角色信息的對象類型,所以,還需要定義這兩個自定義對象類型的數(shù)據(jù)契約。
[ServiceContract(Namespace="CHYDMS.Web")]
[SilverlightFaultBehavior]
[AspNetCompatibilityRequirements(Requiremen-tsMode=AspNetCompatibilityRequirementsMode.Allo-wed)]
public class UserWcfService
{
[OperationContract]
public int RegisterUser(UserInfo ui){…}
[OperationContract]
public UserInfo Login(string uname,string upwd){…}
[OperationContract]
public bool UpdateUserInfo(UserInfo ui){…}
[OperationContract]
public bool ChangePassword(string uname,string oldpwd,string newpwd){…}
[OperationContract]
public int GrantUserRole(string uname,UserRole ur){…}
[OperationContract]
public int UnGrantUserRole(string uname,int rid){…}
[OperationContract]
public UserRole[]GetUserRole(Guid uid,string uname){…}
}
[DataContract]
public class UserInfo
{
[DataMember]
public int UserID{get;set;}//用戶ID
[DataMember]
public string UserName{get;set;}//用戶名
[DataMember]
public string Password{get;set;}//用戶密碼
…
}
[DataContract]
public class UserRole
{
[DataMember]
public int RoleID{get;set;}//ID代碼
[DataMember]
public string Name{get;set;}//角色名稱
[DataMember]
public string Description{get;set;}//描述
}
創(chuàng)建一個命名為PrjManWcfService的啟動了Silverlight功能的WCF服務(wù)為成果管理服務(wù),該服務(wù)定義了“上傳”、“歸檔”、“修改”等操作,其服務(wù)契約定義如下。該服務(wù)的操作方法用到了自定義對象類型PrjInfo,它包含成果資料基本信息,定義PrjInfo對象類型的數(shù)據(jù)契約。
[ServiceContract(Namespace="CHYDMS.
Web")]
[SilverlightFaultBehavior]
[AspNetCompatibilityRequirements(Requiremen-tsMode=AspNetCompatibilityRequirementsMode.
Allowed)]
public class PrjManWcfService
{
[OperationContract]
public int UploadPrjData(Guid uid,PrjInfo pinfo){…}
[OperationContract]
public int ArchivePrj(Guid uid,int pcode,string pname){…}
[OperationContract]
public int UpdatePrjInfo(Guid uid,PrjInfo pinfo){…}
[OperationContract]
public PrjInfo GetPrjInfoByCode(Guid uid,int prjcode){…}
[OperationContract]
public PrjInfo[]QuerryPrj(Guid uid,PrjInfo pinfo){…}
[OperationContract]
public int DownloadPrjData(Guid uid,PrjInfo pinfo){…}
}
[DataContract]
public class PrjInfo
{
[DataMember]
public int PrjID{get;set;}//代碼
[DataMember]
public string Name{get;set;}//名稱
[DataMember]
public double Amount{get;set;}//金額
…
}
WCF服務(wù)允許服務(wù)使用任何協(xié)議與客戶端進行通信,如HTTP、TCP、命名管道、MSMQ、自定義協(xié)議[8],可以根據(jù)允許客戶端的使用范圍來確定使用的通信協(xié)議。本框架系統(tǒng)因為運行在局域網(wǎng)環(huán)境,所以將所有的WCF服務(wù)使用netTcpBinding綁定發(fā)布,它使用TCP協(xié)議。這樣就可以使得WCF服務(wù)限制到只有局部網(wǎng)內(nèi)的用戶可以訪問。另外,本系統(tǒng)框架為Web系統(tǒng)框架,為了保證服務(wù)器數(shù)據(jù)的安全,系統(tǒng)只允許合法登錄的注冊用戶才能使用該系統(tǒng)的功能和數(shù)據(jù),并且要建立詳細的日志功能,用來記錄用戶對基礎(chǔ)數(shù)據(jù)庫的操作足跡。
Silverlight采用JIT方式在客戶端運行,并不依賴瀏覽器運行,而使用自有的運行沙箱,可以跨瀏覽器、跨平臺,無論在哪運行,都能提供一致的用戶體驗。在各個層次Silverlight都能得到.NET平臺的全面支持。
在通信層中,Silverlight支持WCF通信方式,而后者幾乎將目前所有通信類全部管理起來。Silverlight富客戶端通過引用服務(wù)器端承載運行的WCF數(shù)據(jù)服務(wù)并創(chuàng)建該服務(wù)的代理客戶端,這樣,通過客戶端就能夠方便地調(diào)用WCF服務(wù)中公開的用戶功能接口來使用該WCF服務(wù)的操作和數(shù)據(jù)了[9]。
在客戶端控制邏輯層,采用專門后臺工作線程與表現(xiàn)層的UI線程分離,在處理后臺計算的同時不影響界面響應(yīng)。Silverlight客戶端控制邏輯層可以通過讀取數(shù)據(jù)并且更新外觀顯示,但不會通過刷新整體頁面來打斷用戶操作。
在表現(xiàn)層Silverlight具有包括矢量圖形支持、硬件加速、3D圖形、圖形變形,同時還包含原生動畫、特效以及超過100種控件,而用戶也可以通過設(shè)計與開發(fā)兩種方式擴展動畫、特效和控件[10]。本系統(tǒng)框架使用Visual Studio 2010作為Silverlight客戶端的開發(fā)環(huán)境,借助Silverlight的已有控件開發(fā)了多個控件,如各種對話框、交互窗口中的各種輸入控件、各種信息顯示控件等。就像Visual Studio中的控件使用一樣,大大增加了代碼的重用度,降低了開發(fā)工作量。
前面說過,本框架的瀏覽模塊功能不需要與服務(wù)器進行通信,只與當(dāng)前顯示的數(shù)據(jù)有關(guān),所以將該模塊的功能都放在了客戶端的設(shè)計中。這樣做的好處有兩點:①瀏覽操作是使用頻率最高的操作,由于在操作時不與服務(wù)器進行通信,這大大降低了網(wǎng)絡(luò)通信和服務(wù)器的壓力。②由于操作完全是本地的(網(wǎng)絡(luò)操作會有延遲),所以操作會更流暢,用戶體驗更好。
經(jīng)驗證,基于該框架開發(fā)的測繪院成果管理系統(tǒng),解決了測繪成果資料多、存儲分散、檢索困難的問題。
結(jié)論如下:①本框架較好地利用了B/S架構(gòu)和C/S架構(gòu)二者的優(yōu)點。②將部分計算模塊轉(zhuǎn)移到了Silverlight客戶端,大大降低了服務(wù)器的計算壓力。③Silverlight客戶端通過WCF數(shù)據(jù)服務(wù)實現(xiàn)對服務(wù)器端數(shù)據(jù)庫的在線管理和訪問。④該框架為通用框架,類似網(wǎng)絡(luò)信息管理系統(tǒng)建設(shè)可以借鑒該框架設(shè)計。
當(dāng)然,該框架的設(shè)計也有不足之處,用戶通過瀏覽器首次訪問系統(tǒng)時,需安裝Silverlight插件。不過,它只是一個客戶端的運行環(huán)境而已,后續(xù)系統(tǒng)功能上的更新不再依賴于Silverlight客戶端的更新。