于磊
摘要:在開放網(wǎng)絡(luò)環(huán)境下直接暴露數(shù)據(jù)庫給客戶端應(yīng)用存在著眾多的安全威脅。將數(shù)據(jù)庫從開放網(wǎng)絡(luò)中隔離開,借助WCF將應(yīng)用所需的數(shù)據(jù)庫操作以數(shù)據(jù)庫服務(wù)的方式發(fā)布出來;客戶端不再直接訪問數(shù)據(jù)庫,而是通過服務(wù)引用完成數(shù)據(jù)庫操作。從而提高數(shù)據(jù)庫的安全性、消除客戶端應(yīng)用與數(shù)據(jù)庫之間的耦合、增強(qiáng)系統(tǒng)結(jié)構(gòu)的靈活性。通過實(shí)際應(yīng)用開發(fā)表明,該方法具有良好的效果。
關(guān)鍵詞: 服務(wù);契約;終結(jié)點(diǎn);SQL Server
中圖分類號:TP319 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)17-0017-02
在數(shù)據(jù)庫應(yīng)用開發(fā)中,一種傳統(tǒng)的做法是將數(shù)據(jù)庫暴露給客戶端應(yīng)用??蛻舳藨?yīng)用程序根據(jù)需求直接連接數(shù)據(jù)庫以實(shí)現(xiàn)對數(shù)據(jù)庫的各項操作。但當(dāng)整個系統(tǒng)建立在開放網(wǎng)絡(luò)環(huán)境下時,數(shù)據(jù)庫的安全問題便凸顯出來。其主要存在的安全威脅有:漏洞或誤操作導(dǎo)致的數(shù)據(jù)庫數(shù)據(jù)錯誤、非權(quán)限范圍內(nèi)的數(shù)據(jù)被非法訪問、數(shù)據(jù)庫的訪問受到攻擊、數(shù)據(jù)庫內(nèi)的數(shù)據(jù)被非法竊取或篡改等。
微軟的WCF技術(shù)允許創(chuàng)建服務(wù),可以跨進(jìn)程、計算機(jī)和網(wǎng)絡(luò)從其他應(yīng)用程序訪問這些服務(wù)。利用這些服務(wù),可在多個應(yīng)用程序中共享功能,提供數(shù)據(jù)源,或者抽象復(fù)雜進(jìn)程[1]。對于開放網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)庫應(yīng)用,我們可以將數(shù)據(jù)庫從開放網(wǎng)絡(luò)中隔離開,借助WCF將應(yīng)用所需的數(shù)據(jù)庫操作以數(shù)據(jù)庫服務(wù)的方式發(fā)布出來;客戶端不再直接對數(shù)據(jù)庫進(jìn)行訪問,而是通過服務(wù)引用完成數(shù)據(jù)庫操作,從而提高數(shù)據(jù)庫的安全性、消除客戶端應(yīng)用與數(shù)據(jù)庫之間的耦合、增強(qiáng)系統(tǒng)結(jié)構(gòu)的靈活性。
綜上,在我校《成人高等教育畢業(yè)生審核系統(tǒng)》的開發(fā)中,最終采用WCF技術(shù)對數(shù)據(jù)庫操作及訪問進(jìn)行了開發(fā)實(shí)現(xiàn)。
1數(shù)據(jù)契約的建立
WCF的服務(wù)是以消息交換的方式實(shí)現(xiàn)的。在數(shù)據(jù)庫應(yīng)用中,客戶端生成數(shù)據(jù)操作請求,對應(yīng)的請求參數(shù)會被WCF序列化為XML信息集并捆綁到請求消息中發(fā)送到服務(wù)端;而服務(wù)則將接收到的請求消息中表示輸入?yún)?shù)的XML信息反序列化為CLR數(shù)據(jù)類型,并實(shí)現(xiàn)相應(yīng)的數(shù)據(jù)庫操作,其操作的返回值及輸出參數(shù)又會被序列化為XML信息集并捆綁到回復(fù)消息中發(fā)送到客戶端。最后,客戶端再通過反序列化獲得并應(yīng)用返回結(jié)果。而數(shù)據(jù)契約是聲明CLR數(shù)據(jù)類型與XML信息集之間的轉(zhuǎn)換的一種正式規(guī)格說明。
WCF的數(shù)據(jù)契約的建立首先通過在相應(yīng)類或結(jié)構(gòu)上應(yīng)用DataContract特性,表明類或結(jié)構(gòu)可以被按值封送。對于類或結(jié)構(gòu)中需要序列化的字段或?qū)傩猿蓡T,還必須應(yīng)用DataMember特性。例如為了表示系統(tǒng)中的學(xué)生實(shí)體,我們編寫了如下數(shù)據(jù)契約:
2數(shù)據(jù)庫訪問的實(shí)現(xiàn)
在基于WCF的數(shù)據(jù)庫應(yīng)用程序開發(fā)中,其數(shù)據(jù)庫訪問的實(shí)現(xiàn)具有極強(qiáng)的靈活性。首先對于數(shù)據(jù)庫應(yīng)用程序的模式,無論是B/S還是C/S,WCF都沒有嚴(yán)格的限制。其次,在基于三層架構(gòu)的應(yīng)用開發(fā)中,既可以選擇將數(shù)據(jù)訪問層DAL作為服務(wù)發(fā)布,業(yè)務(wù)邏輯層BLL與UI層則由客戶端實(shí)現(xiàn);也可以將業(yè)務(wù)邏輯層作為服務(wù)發(fā)布出來,客戶端只需要實(shí)現(xiàn)UI。最后,在數(shù)據(jù)庫訪問技術(shù)的選擇上,無論是ODBC、LINQ to SQL還是ADO.NET,都可以在WCF中實(shí)現(xiàn)。
本系統(tǒng)采用的是SQL Server數(shù)據(jù)庫管理系統(tǒng),由于目前的應(yīng)用需求只局限在Intranet,因此我們選擇了基于C/S模式并將業(yè)務(wù)邏輯層、UI置于客戶端,只將數(shù)據(jù)訪問層作為WCF服務(wù)發(fā)布出來,而數(shù)據(jù)庫的訪問技術(shù)上我們選擇了ADO.NET。為了完成系統(tǒng)各項數(shù)據(jù)庫操作,首先在SQL Server中建立所需要的存儲過程,系統(tǒng)的數(shù)據(jù)庫訪問實(shí)現(xiàn)結(jié)構(gòu)如圖1所示。
數(shù)據(jù)庫的通用基礎(chǔ)操作由抽象類DbHelper實(shí)現(xiàn),具體對SQL數(shù)據(jù)庫的支持是通過繼承自DbHelper的SqlDbHelper來實(shí)現(xiàn)。而最終的數(shù)據(jù)訪問類型GraduatesDA則繼承自抽象類DbAccessBase實(shí)現(xiàn)。例如GraduatesDA類中通過考生號查詢待審核畢業(yè)學(xué)生的信息的查詢操作實(shí)現(xiàn)為:
(1)服務(wù)契約的建立
服務(wù)契約是對服務(wù)能夠提供的操作的描述,是對操作所采用的消息交換方式的描述和消息格式的定義,以便實(shí)現(xiàn)跨越服務(wù)邊界的服務(wù)調(diào)用。為了完成數(shù)據(jù)契約的定義,我們需要在相應(yīng)的接口或類上應(yīng)用ServiceContract特性,并在需要暴露為WCF契約的方法上顯式使用OperationContract特性,使其成為契約的一部分。
例如,為了描述上述通過考生號查詢待審核畢業(yè)學(xué)生的信息,建立的契約接口如下:
(2)服務(wù)的發(fā)布與寄宿
服務(wù)端最終通過終結(jié)點(diǎn)將服務(wù)發(fā)布出來,而客戶端對服務(wù)的調(diào)用則是通過與之相匹配的終結(jié)點(diǎn)進(jìn)行,終結(jié)點(diǎn)承載了WCF的所有通信功能。終結(jié)點(diǎn)由地址、綁定和契約三要素組成,每個服務(wù)至少必須公開一個終結(jié)點(diǎn)。終結(jié)點(diǎn)的配置既可以以配置的方式實(shí)現(xiàn),也可以以編程的方式實(shí)現(xiàn)。
終結(jié)點(diǎn)中的地址表明服務(wù)的位置,用于完成服務(wù)的尋址。
終結(jié)點(diǎn)中的綁定用于定義服務(wù)的通信方式。綁定是對服務(wù)之間的通信方式的特征的封裝,包括傳輸協(xié)議、消息編碼、通信模式、通信的安全要求等。本系統(tǒng)在綁定的配置選擇了基于TCP作為傳輸協(xié)議的NetTcpBinding,其對應(yīng)的編碼格式為Binary,默認(rèn)使用點(diǎn)到點(diǎn)的Transport安全。
WCF的服務(wù)是駐留在Windows進(jìn)程中實(shí)現(xiàn)的,這種方式被稱為寄宿。用于實(shí)現(xiàn)寄宿的進(jìn)程可以由IIS或WAS提供,也可以是某個特定的應(yīng)用程序提供。基于IIS寄宿所具備的自動化進(jìn)程激活與關(guān)閉、自動化進(jìn)程回收等優(yōu)點(diǎn),我們選擇了IIS 7.0作為服務(wù)的寄宿方式。服務(wù)的終結(jié)點(diǎn)、行為及行為擴(kuò)展等均配置在位于Web應(yīng)用項目目錄下的Web.config中。
IIS默認(rèn)使用的是HTTP協(xié)議,為了實(shí)現(xiàn)對NetTcpBinding的支持,需要對IIS 7.0進(jìn)行配置以完成對Net.Tcp協(xié)議的監(jiān)聽綁定。
4客戶端實(shí)現(xiàn)
系統(tǒng)客戶端的開發(fā)基于WPF完成,對于WCF服務(wù)的引用,一種最簡單的方式在項目內(nèi)通過添加服務(wù)引用的方式實(shí)現(xiàn)。然后基于引入的等效服務(wù)契約接口,創(chuàng)建單獨(dú)的類型來封裝所有的對服務(wù)端的服務(wù)調(diào)用,實(shí)現(xiàn)業(yè)務(wù)邏輯層及UI層即可。
5結(jié)語
通過實(shí)際開發(fā)應(yīng)用,基于WCF的數(shù)據(jù)庫操作及訪問的服務(wù)發(fā)布,能夠?qū)?shù)據(jù)庫從開放網(wǎng)絡(luò)中隔離出來,提高了數(shù)據(jù)庫的安全性,消除客戶端應(yīng)用與數(shù)據(jù)庫之間的耦合,并能很好地適應(yīng)未來系統(tǒng)結(jié)構(gòu)改變的需求,增強(qiáng)了系統(tǒng)結(jié)構(gòu)的靈活性。
參考文獻(xiàn):
[1](美)Karli Watson.C#入門經(jīng)典[M]. 6版.北京:清華大學(xué)出版社,2014.
[2](美)Juval L?wy,Michael Montgomery. WCF服務(wù)編程 [M]. 4版.武漢:華中科技大學(xué)出版社,2017.
[3]蔣金楠. WCF全面解析(上冊) [M].北京:電子工業(yè)出版社,2012.
[4]蔣金楠. WCF全面解析(下冊) [M].北京:電子工業(yè)出版社,2012.
[5](美)Steve Resnick. WCF核心技術(shù)[M].北京:人民郵電出版社,2009.
[6](美)Christian Nagel. C#高級編程[M]. 9版.北京:清華大學(xué)出版社,2014.
[7](美)Matthew MacDonald.WPF編程寶典 [M]. 4版.北京:清華大學(xué)出版社,2009.
[8](美)劉鐵猛. 深入淺出WPF [M].北京:中國水利出版社,2010.
[9](美)Mark Michaelis. C#本質(zhì)論 [M]. 2版.北京:人民郵電出版社,2009.
[10](美)Erik Freeman. Head First設(shè)計模式[M].北京:中國電力出版社,2007.