楊遠超
(中鐵第一勘察設(shè)計院集團有限公司, 陜西西安 710043)
在鐵路勘測設(shè)計過程中,除了少部分的描述性文本資料外,各專業(yè)的文件大都可以用地理坐標(biāo)系和線路坐標(biāo)系來標(biāo)識。以地理坐標(biāo)系來描述的成果多為勘測類數(shù)據(jù),如各類控制點、地形圖、地質(zhì)圖等,這些數(shù)據(jù)的空間特性需要二維或三維坐標(biāo)來描述。以線路坐標(biāo)系來描述的成果多為專業(yè)設(shè)計數(shù)據(jù),與鐵路相關(guān)的數(shù)據(jù)的空間特性轉(zhuǎn)化為沿鐵路線的一維標(biāo)識(即線路里程)。通過線路曲線和斷鏈信息,可以將勘測設(shè)計成果數(shù)據(jù)在地理坐標(biāo)系和線路坐標(biāo)系間轉(zhuǎn)換,坐標(biāo)轉(zhuǎn)換需要考慮地理坐標(biāo)系的分帶和線路坐標(biāo)系的所屬方案等問題。
將一條鐵路線的勘察設(shè)計定義為一個項目,以方案和坐標(biāo)為關(guān)鍵字來建立各專業(yè)數(shù)據(jù)庫,各專業(yè)數(shù)據(jù)庫間的數(shù)據(jù)接口參照正式頒布的數(shù)據(jù)接口標(biāo)準(zhǔn)來建立。某個專業(yè)一旦完成某項工作,就將結(jié)果存入數(shù)據(jù)庫,同時發(fā)布消息,通知后續(xù)專業(yè)使用。專業(yè)數(shù)據(jù)可抽象為文件類和表格類數(shù)據(jù)。文件類數(shù)據(jù)是指以各種文件格式存儲的專業(yè)勘測設(shè)計數(shù)據(jù),包括各類圖片、圖形、文本、電子表格文件,這類數(shù)據(jù)在數(shù)據(jù)庫中都以BLOB對象進行存儲,導(dǎo)入數(shù)據(jù)庫時將文件轉(zhuǎn)換為二進制數(shù)據(jù)流,獲取數(shù)據(jù)時將其還原為對應(yīng)格式的文件。表格類數(shù)據(jù)是指在專業(yè)數(shù)據(jù)庫中以數(shù)據(jù)庫表格形式存儲的數(shù)據(jù),可使用SQL語言直接解析數(shù)據(jù)的全部屬性。數(shù)據(jù)分類與組織如圖1所示。
圖1 鐵路協(xié)同設(shè)計平臺的數(shù)據(jù)分類與組織
WCF(Windows Communication Foundation)是微軟公司為構(gòu)建面向服務(wù)的應(yīng)用提供的分布式通信編程框架,可以用它構(gòu)建跨平臺,安全、可靠和支持事務(wù)處理的企業(yè)級互聯(lián)應(yīng)用解決方案。其基礎(chǔ)的技術(shù)架構(gòu)如圖2所示。
圖2 WCF技術(shù)架構(gòu)
如圖2所示,WCF服務(wù)端向客戶端提供一些可用的功能,如服務(wù)1、2、3,WCF客戶端通過終結(jié)點來訪問WCF服務(wù),一個服務(wù)端至少要提供一個終結(jié)點供客戶端使用。服務(wù)端的終結(jié)點,由“ABC”構(gòu)成,Address(地址)解決在哪里找到服務(wù)的問題;Binding(綁定)解決如何與服務(wù)進行通訊的問題;Contract(契約)解決服務(wù)是一些什么內(nèi)容的問題。
一個WCF服務(wù)需要在一個可運行的程序中寄宿,可以把宿主理解為WCF運行的容器。在客戶端訪問服務(wù)之前,服務(wù)必須通過宿主程序發(fā)布出來。常用的WCF寄宿方式包括:自寄宿、IIS寄宿、Windows激活服務(wù)、Windows服務(wù)。根據(jù)面向服務(wù)的原則,激活和宿主類型的變化不會影響服務(wù)本身的特性和外部對該服務(wù)的訪問,這樣就可以根據(jù)實際部署的需要靈活選用各類寄宿方式。在實際應(yīng)用中,以IIS寄宿類型居多,本文將也以IIS宿主程序為例,介紹如何構(gòu)建分布式數(shù)據(jù)服務(wù)。
首先以管理員身份啟動Microsoft Visual Studio 2010程序(操作系統(tǒng)為 Windows Server 2008),點擊文件—新建—項目,打開一個對話框,在左側(cè)的模板中選擇編程語言(如Visual C#),然后選擇“WCF”,在隨后出現(xiàn)的類型中選擇“WCF服務(wù)程序”,依次填入項目的名稱、項目文件路徑和解決方案名稱,最后點擊“確定”,創(chuàng)建一個WCF服務(wù)程序。
然后按照微軟的推薦做法,先在形如IServiceRealScene.cs(RealScene為項目名稱)的文件中定義數(shù)據(jù)服務(wù)的接口(IServiceRealScene)和數(shù)據(jù)契約。如本項目中定義了項目、分帶坐標(biāo)系、方案、專業(yè)、存儲格式、線路曲線、斷鏈、坡度、設(shè)計標(biāo)準(zhǔn)類型、設(shè)計標(biāo)準(zhǔn)等數(shù)據(jù)類型,用作接口服務(wù)的參數(shù)定義。服務(wù)接口程序的定義則根據(jù)需要訂制,可以自由選擇其參數(shù)和返回值類型。如示例項目就定義了從總服務(wù)器查詢專業(yè)數(shù)據(jù)的注冊信息以及根據(jù)注冊信息索引從專業(yè)數(shù)據(jù)庫提取、更新數(shù)據(jù)的各類服務(wù)。在定義的數(shù)據(jù)服務(wù)中,如果需要返回一個通用的xml文檔(即System.Xml.XmlDocument類型),則需要在接口定義前加上形如[XmlSerializerFormat]字樣的標(biāo)記,否則客戶端程序?qū)⒉荒苷_識別接口,導(dǎo)致程序編譯錯誤。需要特別說明的是,如果編寫的服務(wù)要實現(xiàn)分布式事務(wù),在不同的數(shù)據(jù)庫中提交數(shù)據(jù)更改,則在定義服務(wù)接口時需要在接口定義前加上[TransactionFlow(TransactionFlowOption.Allowed)]字樣的標(biāo)記,表示服務(wù)操作愿意接受來自客戶端的傳入事務(wù)。
最后,打開形如ServiceRealScene.svc(RealScene為項目名稱)的文件,在其中編寫數(shù)據(jù)服務(wù)接口的實現(xiàn)代碼,在上一步驟中定義的每一個數(shù)據(jù)服務(wù)接口都必須在此實現(xiàn)。給繼承自接口IServiceRealScene的類ServiceRealScene加上[ServiceBehavior(Instance ContextMode=InstanceContextMode.PerCall,Concurrency Mode=ConcurrencyMode.Multiple)]字樣的標(biāo)記,用來指示其服務(wù)行為中的實例控制、并發(fā)控制模式。服務(wù)端實例控制采用了PerCall實例策略,每個客戶端的請求消息都會被分發(fā)到一個新的服務(wù)實例上。而一旦這個調(diào)用返回后,服務(wù)實例則會被銷毀。并發(fā)控制模式為Multiple,表示W(wǎng)CF不會主動為服務(wù)操作添加任何鎖,每個操作都允許客戶端多個請求同時訪問,這樣做的好處是提高了系統(tǒng)的運行效率,防止消息被阻塞。實現(xiàn)接口服務(wù)的類函數(shù)必須與接口服務(wù)函數(shù)名相同,參數(shù)一致,并且設(shè)置為公眾函數(shù)public供客戶端調(diào)用。同樣,若要實現(xiàn)分布式事務(wù),則應(yīng)將前面所述的并發(fā)控制模式應(yīng)為Single模式,即ConcurrencyMode=ConcurrencyMode.Single,并在要實現(xiàn)事務(wù)處理的函數(shù)加上[OperationBehavior(TransactionScopeRequired=true)]字樣的標(biāo)記,表示此函數(shù)在執(zhí)行時需要事務(wù)范圍。
在VS 2010程序的“解決方案管理器”中選擇建立WCF服務(wù)程序,點右鍵選擇“屬性”選項,在打開的頁面中選擇“Web”,選中“使用本地IIS Web服務(wù)器”,點擊“創(chuàng)建虛擬目錄”,則在本地的IIS Web服務(wù)器創(chuàng)建了一個與項目名相同的網(wǎng)站。啟動本地Internet信息服務(wù)(IIS)管理器,在左側(cè)的網(wǎng)站列表中點擊這個網(wǎng)站,然后雙擊其“目錄瀏覽”圖標(biāo),在打開的頁面右側(cè)的“操作”欄點擊“啟動”,打開網(wǎng)站目錄瀏覽的功能,完成數(shù)據(jù)服務(wù)的發(fā)布。
在客戶端建立控制臺應(yīng)用程序或Windows窗體應(yīng)用程序,在界面右側(cè)的“解決方案資源管理器”中右鍵點擊“引用”目錄,選擇“添加服務(wù)引用”,在彈出的對話框“地址”欄中輸入服務(wù)的發(fā)布地址(可通過運行WCF服務(wù)端程序,點擊打開網(wǎng)頁后綴名為SVC的鏈接,則打開的網(wǎng)址即為服務(wù)地址,非本地引用時需要將其localhost字樣換為服務(wù)器所在的IP地址即可),點擊“前往”按鈕,則找到對應(yīng)的服務(wù),在“命名空間”欄輸入客戶端引用服務(wù)的名稱,點擊“確定”按鈕,則成功添加服務(wù)引用,如圖3所示。
圖3 客戶端引用數(shù)據(jù)服務(wù)
添加服務(wù)引用后,在客戶端就可以通過代理直接使用服務(wù)端發(fā)布的數(shù)據(jù)服務(wù),實現(xiàn)所需的數(shù)據(jù)發(fā)布與更新功能。
WCF技術(shù)本身具有很好的兼容性,可以在不改變鐵路設(shè)計各專業(yè)既有后臺數(shù)據(jù)的情況下,以專業(yè)間的數(shù)據(jù)交換標(biāo)準(zhǔn)為參照,通過服務(wù)接口的定義和發(fā)布,實現(xiàn)數(shù)據(jù)的分發(fā)與共享,完成專業(yè)間的協(xié)同設(shè)計。當(dāng)然,由于鐵路設(shè)計本身的復(fù)雜性和專業(yè)協(xié)同的要求,對數(shù)據(jù)服務(wù)權(quán)限、數(shù)據(jù)版本的控制以及在用戶并發(fā)量上升時如何保證服務(wù)的可靠性和有效性,這些都需要通過對系統(tǒng)的精心設(shè)計和嚴(yán)格測試,才能使建立的分布式數(shù)據(jù)服務(wù)達到應(yīng)用的要求。
[1]布斯塔曼特(Micbele Leroux Bustamance)(著),龐引明、侯伯薇(譯).學(xué)習(xí)WCF從原理到實踐[M].北京:電子工業(yè)出版社,2008
[2]吳清壽.基于WCF的分布式系統(tǒng)模型研究與實現(xiàn)[J].吉林師范大學(xué)學(xué)報(自然科學(xué)版),2012(3)
[3]李雪東.基于WCF面向服務(wù)架構(gòu)的研究與應(yīng)用[D].長春:長春理工大學(xué),2009
[4]汪享慶.鐵路勘測設(shè)計協(xié)同設(shè)計探討[J].交通與計算機,2008(1)
[5]石紅兵,鄭云,曾學(xué)貴.勘測設(shè)計一體化軟件開發(fā)過程中數(shù)據(jù)庫的設(shè)計[J].鐵道工程學(xué)報,2000(2)
[6]彭先寶.鐵路勘測設(shè)計一體化系統(tǒng)開發(fā)策略分析[J].鐵道勘察,2008(2)