邱 玲,張立人,何海濤
(四川理工學(xué)院計算機學(xué)院,四川 自貢 643000)
Web服務(wù)提供了基于HTML的Web站點以外的快速、靈活的數(shù)據(jù)獲取途徑,然而,普通的Web服務(wù)只適合傳輸能被XML高效打包的數(shù)據(jù)類型,對于一些二進(jìn)制數(shù)據(jù),例如圖形、圖像、音頻等,卻難以高效傳輸,這嚴(yán)重限制了Web服務(wù)的應(yīng)用領(lǐng)域。隨著微軟公司的SOAP擴展技術(shù)的引入[1],我們能對Web服務(wù)的全過程進(jìn)行控制,從而具有傳輸任意數(shù)據(jù)類型的可能性。
Web服務(wù)作為一個跨平臺獲取數(shù)據(jù)的協(xié)議,必須屏蔽掉各種硬件平臺和操作系統(tǒng)平臺的差異。因此,Web服務(wù)必須提供以下幾個方面的功能:一種獨立于平臺的數(shù)據(jù)交換格式、一種描述數(shù)據(jù)結(jié)構(gòu)的方法、打包數(shù)據(jù)以跨越Internet傳輸?shù)臉?biāo)準(zhǔn)方法、Web服務(wù)通知客戶程序自身結(jié)構(gòu)的方法以及以編程方式定位Web服務(wù)的方法。為了實現(xiàn)這些功能,Web服務(wù)采用的技術(shù)分別是:使用XML進(jìn)行數(shù)據(jù)的表達(dá)、用XML大綱進(jìn)行數(shù)據(jù)結(jié)構(gòu)的描述、以SOAP協(xié)議來打包數(shù)據(jù)并在Internet上傳輸、利用WSDL語言描述自身、以及采用UDDI進(jìn)行定位[2-3]。
在這些基礎(chǔ)技術(shù)中,我們著重考察數(shù)據(jù)的XML表達(dá)形式。XML是純文本格式,但通過串行化和反串行化技術(shù)可以封裝二進(jìn)制數(shù)據(jù)。例如,一個整數(shù)1234,要發(fā)送出去時,串行化為文本“1234”,當(dāng)對方收到這個文本后,又進(jìn)行反串行化成為整數(shù)1234。由于文本格式對于任何平臺都是可讀的,所以XML就具有了跨平臺傳輸數(shù)據(jù)的性質(zhì)。但同時我們也注意到,串行化和反串行化是低效的,占用了大量的CPU時間,同時,用文本格式表達(dá)二進(jìn)制將使用更多的字節(jié),從而占用了更多的網(wǎng)絡(luò)帶寬。因此,這種基于串行化和反串行化的XML表達(dá)方式并不適用于復(fù)雜的數(shù)據(jù)類型。
Web服務(wù)的體系結(jié)構(gòu)[4]是客戶端/服務(wù)器形式,所以在工作中首先由客戶端發(fā)起請求,然后由Web服務(wù)應(yīng)答。由于這個過程是跨Internet進(jìn)行的,要求穿越防火墻,所以將請求報文和應(yīng)答報文都封裝成SOAP報文形式,以HTTP協(xié)議進(jìn)行發(fā)送,這樣Web服務(wù)的工作過程實際就是客戶端程序構(gòu)造SOAP請求報文,其中以XML的形式串行化函數(shù)調(diào)用的名稱和參數(shù),然后將其以HTTP協(xié)議發(fā)送給Web服務(wù)端;Web服務(wù)端接收到請求報文后,對參數(shù)進(jìn)行反串行化,完成函數(shù)調(diào)用,將計算結(jié)果重新串行化為XML形式,打包成SOAP應(yīng)答報文,最后用HTTP協(xié)議發(fā)送回客戶端;客戶端收到應(yīng)答報文后,對計算結(jié)果進(jìn)行反串行化,從而得到實際的返回值,Web服務(wù)的一次工作過程完成。
在這個過程中,客戶端程序只要發(fā)起了發(fā)送命令,就不能再進(jìn)行任何操作,只能等待Web服務(wù)的應(yīng)答。Web服務(wù)端同樣如此,從接收到請求報文到發(fā)送應(yīng)答報文都是Web服務(wù)器自動進(jìn)行[5]。系統(tǒng)將自動進(jìn)行相應(yīng)的串行化、反串行化、SOAP報文的構(gòu)造以及網(wǎng)絡(luò)傳輸工作。整個過程都沒有允許客戶程序和Web服務(wù)進(jìn)行更多的控制。
從以上討論可以看出,由于XML串行化和反串行化的低效,同時Web服務(wù)沒有允許我們對請求服務(wù)的全過程進(jìn)行深入的控制,所以對于一些特殊類型的數(shù)據(jù)我們難以通過Web服務(wù)進(jìn)行有效傳輸,例如圖形、圖像、音頻以及含有復(fù)雜數(shù)據(jù)的對象等。這樣就限制了Web服務(wù)的應(yīng)用性。為了進(jìn)行任意數(shù)據(jù)的高效傳輸,需要引入一種更深入的機制到Web服務(wù)標(biāo)準(zhǔn)中,這就是SOAP擴展。
SOAP擴展[6]的基本思想是將一個SOAP報文從發(fā)送到接收的整個過程劃分為4個階段,每個階段都允許代碼進(jìn)行攔截和干預(yù),從而控制對某些數(shù)據(jù)的串行化與否、數(shù)據(jù)的加密解密以及在SOAP報文中加入特定數(shù)據(jù)等。這4個階段及其作用是:
(1)BeforeSerialize
串行化之前階段,即對象串行化為SOAP報文之前階段。此階段攔截到的是二進(jìn)制數(shù)據(jù)。對于客戶端,這是在SOAP請求發(fā)送給Web服務(wù)之前,對于Web服務(wù),這是在對Web方法調(diào)用的響應(yīng)被返回客戶端之前。
(2)AfterSerialize
串行化之后階段,此時,對象已經(jīng)串行化為SOAP報文,但還沒有被發(fā)送出去。此階段攔截到的是文本形式的SOAP報文。對于客戶端和WEB服務(wù),情形與BeforeSerialize相同。
(3)BeforeDeserialize
反串行化之前階段,即已經(jīng)接收到一個SOAP請求和應(yīng)答報文,但還沒有進(jìn)行反串行化。此階段攔截到的報文是文本形式。對于客戶端,是從Web服務(wù)獲得響應(yīng)的時候,對于Web服務(wù),是從客戶端收到請求的時候。
(4)AfterDeserialize
反串行化之后階段,這時,已經(jīng)將接收到的SOAP報文反串行化了。此階段攔截到的報文是二進(jìn)制形式。對于客戶端和Web服務(wù),情形與BeforeDeserialize階段相同。
這里,僅考慮高效傳輸大塊二進(jìn)制數(shù)據(jù)。SOAP擴展給了我們一種思路:既然我們想在SOAP報文中加入大塊二進(jìn)制數(shù)據(jù)而又不希望對這些數(shù)據(jù)進(jìn)行例行的串行化和反串行化,那就應(yīng)該在發(fā)送方已經(jīng)經(jīng)過串行化形成了文本形式的SOAP報文以后,而在發(fā)送出去以前,將大塊二進(jìn)制數(shù)據(jù)插入文本SOAP報文的某個位置;當(dāng)接收方收到這個文本SOAP報文后,也應(yīng)該在進(jìn)行反串行化之前從那個位置取出大塊二進(jìn)制數(shù)據(jù),并刪除以還原SOAP報文的本來面目,再進(jìn)行其他數(shù)據(jù)的反串行化。由于SOAP報文中的格式只對Web服務(wù)有效而對HTTP協(xié)議無效,所以我們插入大塊二進(jìn)制數(shù)據(jù)后不會影響SOAP報文在網(wǎng)絡(luò)上的傳輸。因此,我們只要選擇在發(fā)送方的AfterSerialize階段和接收方的BeforeDeserialize階段進(jìn)行攔截并做相應(yīng)處理即可實現(xiàn)大塊二進(jìn)制數(shù)據(jù)的傳輸。
首先從SoapExtension類派生出自己的擴展類,其中最重要的是重載ProcessMessage()方法。對于Web服務(wù)端,在這個方法中響應(yīng)AfterSerialize階段。下列關(guān)鍵代碼表示了在原SOAP報文的某處插入一個圖像文件:
FileStream fs=new FileStream("d:\old.jpg",
FileMode.Open,F(xiàn)ileAccess.Read);
unsafe
{
long len=fs.Length;
byte*p=(byte*)&len;
for(int j=0;j<8;j++)
tempStream.WriteByte(*(p++));
}
Copy(fs,tempStream);
fs.Close();
對于客戶程序,在ProcessMessage()方法中響應(yīng)BeforeDeserialize階段,從SOAP報文的約定字節(jié)處取出這個圖像文件。從本例可見,通過SOAP擴展的方法可以很好地實現(xiàn)二進(jìn)制數(shù)據(jù)的傳輸。
對于客戶程序,在ProcessMessage()方法中響應(yīng)BeforeDeserialize階段,從SOAP報文的約定字節(jié)處取出這個圖像文件。從本例可見,通過SOAP擴展的方法很好地實現(xiàn)了二進(jìn)制數(shù)據(jù)的傳輸。。
[1] 馮柳平.基于SOAP擴展的Web服務(wù)安全機制研究[J].北京印刷學(xué)院學(xué)報,2009,17(6):37-39.
[2] Joseph Bustos,Karli Watson.NET Web服務(wù)入門經(jīng)典[M].北京:清華大學(xué)出版社,2003.
[3] Russ Basiura,Mike Batongbacal,著.康 博,譯.ASP.NET Web服務(wù)高級編程[M].北京:清華大學(xué)出版社,2002.
[4] 曾 岫,彭 宏,左國威.基于SOAP擴展的Web服務(wù)安全模型[J].廣州航海高等??茖W(xué)校學(xué)報,2008,16(2):40-42.
[5] 李林靜,趙建偉.加強SOAP消息安全通信平臺的分析及實現(xiàn)[J].計算機與數(shù)字工程,2011,39(3):92-97.
[6] 李林靜,趙建偉.一種基于SOAP擴展的SOAP消息分析方法[J].計算機系統(tǒng)應(yīng)用,2012,21(1):152-155.
四川輕化工大學(xué)學(xué)報(自然科學(xué)版)2013年2期