生力軍
摘要: 針對(duì)動(dòng)態(tài)頁(yè)面技術(shù)缺點(diǎn),基于ASP.NET框架,提出了動(dòng)態(tài)頁(yè)面靜態(tài)化的3種不同實(shí)現(xiàn)方案——真靜態(tài)、偽靜態(tài)、折中法。其中,偽靜態(tài)主要使用HttpModule攔截并修改HTTP請(qǐng)求中的URL地址;折中法主要使用HttpHandler結(jié)合靜態(tài)頁(yè)面模板生成并返回靜態(tài)頁(yè)面文件。給出了頁(yè)面靜態(tài)化實(shí)現(xiàn)方案選擇策略,即利用參數(shù)對(duì)動(dòng)態(tài)網(wǎng)頁(yè)進(jìn)行分類,不同的動(dòng)態(tài)網(wǎng)頁(yè)采用不同的靜態(tài)化實(shí)現(xiàn)方案。
關(guān)鍵詞:ASP.NET;靜態(tài)化;HttpModule;HttpHandler;選擇策略
DOIDOI:10.11907/rjdk.171136
中圖分類號(hào):TP301
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2017)006-0022-03
0 引言
動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)因其交互性強(qiáng)、數(shù)據(jù)刷新實(shí)時(shí)等特點(diǎn)[1],使網(wǎng)站開(kāi)發(fā)效率和維護(hù)效率得到了大幅提升,目前互聯(lián)網(wǎng)上大部分網(wǎng)站都采用動(dòng)態(tài)網(wǎng)頁(yè)技術(shù)構(gòu)建,但其存在的問(wèn)題卻不容忽視。
(1)對(duì)搜索引擎不夠友好。目前,很多搜索引擎不支持動(dòng)態(tài)鏈接,在網(wǎng)絡(luò)上獲取頁(yè)面時(shí),會(huì)優(yōu)先獲取HTML靜態(tài)頁(yè)面內(nèi)容。
(2)降低服務(wù)器性能。如果頁(yè)面訪問(wèn)量比較大,動(dòng)態(tài)頁(yè)面會(huì)頻繁與數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行交互,降低服務(wù)器性能。當(dāng)前,在Web技術(shù)中,只有HTML的靜態(tài)頁(yè)面效率最高,對(duì)服務(wù)器性能要求最低[2]。
(3)暴露網(wǎng)站使用技術(shù)。如果動(dòng)態(tài)頁(yè)面含有類似.jsp或.aspx這樣的擴(kuò)展名,那么制作網(wǎng)站技術(shù)便一目了然,使黑客容易有針對(duì)性地對(duì)網(wǎng)站進(jìn)行攻擊。
針對(duì)上述問(wèn)題,有必要對(duì)動(dòng)態(tài)頁(yè)面進(jìn)行靜態(tài)化處理。目前,大多數(shù)網(wǎng)站都采用單一的靜態(tài)化實(shí)現(xiàn)方案,但是在某些情況下,服務(wù)器性能不但沒(méi)有提高,反而出現(xiàn)了下降。
實(shí)際上,對(duì)于不同類型的動(dòng)態(tài)頁(yè)面,其靜態(tài)化實(shí)現(xiàn)方案應(yīng)該有所區(qū)別,以最大限度提高服務(wù)器性能。本文首先分析了ASP.NET框架下不同頁(yè)面靜態(tài)化實(shí)現(xiàn)方案,然后將動(dòng)態(tài)頁(yè)面進(jìn)行分類,按照不同頁(yè)面的特點(diǎn)采用不同的靜態(tài)化實(shí)現(xiàn)方法。
1 實(shí)現(xiàn)方案
目前,實(shí)現(xiàn)頁(yè)面靜態(tài)化技術(shù)主要有以下幾種方案:
(1)真靜態(tài)。這種方案真正將動(dòng)態(tài)頁(yè)面批量轉(zhuǎn)化成靜態(tài)頁(yè)面并存儲(chǔ)在服務(wù)器上。這種方案的優(yōu)點(diǎn)是空間成本較低,不需要數(shù)據(jù)庫(kù)服務(wù)器。其缺點(diǎn)也很明顯:一旦網(wǎng)站規(guī)模較大,頁(yè)面的維護(hù)全部依靠手工操作,工作量巨大,維護(hù)困難。因此,這種方式只適合一些簡(jiǎn)單的、更新頻率極低的介紹性頁(yè)面。
(2)偽靜態(tài)。這種方案其實(shí)并沒(méi)有真正將動(dòng)態(tài)頁(yè)面轉(zhuǎn)化為靜態(tài)頁(yè)面,而是通過(guò)URL重寫(xiě)技術(shù),將動(dòng)態(tài)頁(yè)面路徑重寫(xiě)成.html靜態(tài)頁(yè)面路徑,主要實(shí)現(xiàn)搜索引擎友好性與網(wǎng)站安全性,而性能與單純的動(dòng)態(tài)頁(yè)面沒(méi)有差異。這種方案適用于更新速度快而訪問(wèn)量較小的動(dòng)態(tài)頁(yè)面。
(3)折中法。這種方案在用戶訪問(wèn)靜態(tài)頁(yè)面時(shí),首先判斷靜態(tài)頁(yè)面在服務(wù)器上是否存在,如果存在就直接將靜態(tài)頁(yè)面返回給客戶端;如果不存在,則執(zhí)行轉(zhuǎn)化操作生成靜態(tài)頁(yè)面,將該頁(yè)面發(fā)送給客戶端并保存在服務(wù)器上,下次再請(qǐng)求該頁(yè)面時(shí)則無(wú)需執(zhí)行轉(zhuǎn)換操作。
以上3種方案在動(dòng)態(tài)頁(yè)面靜態(tài)化實(shí)現(xiàn)中可結(jié)合使用。由于真靜態(tài)實(shí)現(xiàn)方式與靜態(tài)頁(yè)面制作方式相同,本文不再贅述。下面給出ASP.NET下偽靜態(tài)和折中法的實(shí)現(xiàn)方式。
1.1 偽靜態(tài)實(shí)現(xiàn)方式
偽靜態(tài)實(shí)現(xiàn)依賴對(duì)用戶請(qǐng)求的URL地址重寫(xiě)。在ASP.NET框架下,可以使用框架中提供的HttpModule對(duì)HTTP請(qǐng)求進(jìn)行攔截,對(duì)請(qǐng)求的地址進(jìn)行驗(yàn)證。如果符合重寫(xiě)要求即將URL地址轉(zhuǎn)換成動(dòng)態(tài)頁(yè)面形式,在服務(wù)器端對(duì)用戶請(qǐng)求進(jìn)行重定向。具體實(shí)現(xiàn)步驟為:①新建一個(gè)類,實(shí)現(xiàn)IHttpModule接口,命名為StaticModule;②在新建類中定義一個(gè)EventHandler委托類型方法,命名為context_BeginRequest;③在context_BeginRequest方法中獲取用戶請(qǐng)求的原始URL;④對(duì)原始URL進(jìn)行驗(yàn)證(可使用正則表達(dá)式),如果驗(yàn)證成功則生成真實(shí)的URL地址;⑤在服務(wù)器端將用戶請(qǐng)求重定向到真實(shí)的URL地址;⑥重寫(xiě)IHttpModule接口中的Init方法,將context_BeginRequest方法綁定到請(qǐng)求處理之前觸發(fā)的事件中;⑦在web.config配置文件中注冊(cè)StaticModule。
1.2 折中法實(shí)現(xiàn)方式
折中法實(shí)現(xiàn)關(guān)鍵在于如何在靜態(tài)頁(yè)面不存在的情況下自動(dòng)生成靜態(tài)頁(yè)面。在ASP.NET框架下,可以使用框架中提供的HttpHandler[3]對(duì)Http請(qǐng)求進(jìn)行處理,提供關(guān)鍵參數(shù),生成真實(shí)靜態(tài)頁(yè)面地址,判斷靜態(tài)頁(yè)面文件是否存在。如果存在,則直接返回靜態(tài)頁(yè)面文件,否則就生成靜態(tài)頁(yè)面文件。在生成靜態(tài)頁(yè)面文件時(shí),為了提高生成效率,可以提前準(zhǔn)備好靜態(tài)頁(yè)面模板,運(yùn)用特殊符號(hào)標(biāo)簽作為占位符,在生成頁(yè)面時(shí)只需對(duì)占位符進(jìn)行替換即可。實(shí)現(xiàn)步驟:①制作靜態(tài)頁(yè)面模板Template.html,模板中用特殊符號(hào)(如:{$xxxx})作為內(nèi)容占位符;②新建一個(gè)類,實(shí)現(xiàn)IHttpHandler接口,命名為StaticHandler;③重寫(xiě)IHttpHandler接口中的ProcessRequest方法,在其中獲取用戶請(qǐng)求的URL地址,并將其轉(zhuǎn)換為真實(shí)的靜態(tài)頁(yè)面地址;④判斷上一步生成的真實(shí)靜態(tài)頁(yè)面是否存在,如果存在則直接將頁(yè)面返回,否則讀取靜態(tài)頁(yè)面模板Template.html,將模板中的占位符替換為真實(shí)數(shù)據(jù),將文件另存為靜態(tài)頁(yè)面文件并將其返回給客戶端;⑤在web.config配置文件中注冊(cè)StaticHandler。
2 頁(yè)面靜態(tài)化實(shí)現(xiàn)方案選擇策略
從性能角度考慮,應(yīng)該優(yōu)先選擇真靜態(tài)和折中法進(jìn)行頁(yè)面靜態(tài)化,特性越接近靜態(tài)頁(yè)面的動(dòng)態(tài)頁(yè)面,其靜態(tài)化價(jià)值越大,即讀取頻率越高、更新頻率越低的頁(yè)面越適合靜態(tài)化。讀寫(xiě)比[4]是定量參數(shù),即進(jìn)行一次靜態(tài)化操作后,下一次被靜態(tài)化前該網(wǎng)頁(yè)讀取的次數(shù)。網(wǎng)站可以根據(jù)實(shí)際需求設(shè)置讀寫(xiě)比閾值(記為p)。當(dāng)網(wǎng)頁(yè)讀寫(xiě)比大于p時(shí),靜態(tài)化對(duì)性能有提升,反之,盲目靜態(tài)化就會(huì)增加服務(wù)器的文件讀寫(xiě)工作量,反而影響效率。
如圖1所示,對(duì)頁(yè)面進(jìn)行分類,其中讀寫(xiě)比函數(shù)f(x)=px為靜態(tài)化方案選擇的分界線,分界線之上的Ⅱ區(qū)頁(yè)面可以選擇折中法,其中寫(xiě)頻率較低的Ⅰ區(qū)頁(yè)面可以考慮使用真靜態(tài)法;而分界線以下的Ⅲ區(qū)頁(yè)面就不適合頻繁讀寫(xiě)的靜態(tài)網(wǎng)頁(yè)文件,從搜索引擎友好性和安全性考慮,更適合使用偽靜態(tài)法實(shí)現(xiàn)。
3 結(jié)語(yǔ)
本文分析了動(dòng)態(tài)頁(yè)面靜態(tài)化實(shí)現(xiàn)方案,即真靜態(tài)、偽靜態(tài)和折中法,并給出了偽靜態(tài)和折中法在ASP.NET框架下的實(shí)現(xiàn)。偽靜態(tài)主要利用HttpModule對(duì)Http請(qǐng)求進(jìn)行攔截,從而重定向頁(yè)面地址;折中法主要利用HttpHandler生成并返回真實(shí)的靜態(tài)頁(yè)面文件。3種實(shí)現(xiàn)方案各有特點(diǎn),應(yīng)根據(jù)不同的動(dòng)態(tài)頁(yè)面選擇不同的實(shí)現(xiàn)方案。讀寫(xiě)比是一個(gè)可供分類網(wǎng)頁(yè)的參數(shù),讀寫(xiě)比高的頁(yè)面可使用折中法實(shí)現(xiàn),更新頻率極低的頁(yè)面可考慮使用真靜態(tài)法,而讀寫(xiě)比低的頁(yè)面可使用偽靜態(tài)法實(shí)現(xiàn)。
參考文獻(xiàn):
[1]趙志勤,朱永虎,林玉鳳.面向數(shù)據(jù)分析的Web頁(yè)面靜態(tài)化方法研究與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī),2014 (13):37-40.
[2]曾小燕,周統(tǒng)鋼.基于數(shù)據(jù)集成的頁(yè)面靜態(tài)化方法在政務(wù)網(wǎng)站的應(yīng)用[J].電腦知識(shí)與技術(shù),2014,10(15):3695-3696.
[3]沈陽(yáng).基于HttpHandler的頁(yè)面靜態(tài)化[J].數(shù)字技術(shù)與應(yīng)用,2012 (1):50-51.
[4]白萬(wàn)民,吳夫丹,白小軍.Web應(yīng)用中的網(wǎng)頁(yè)靜態(tài)化技術(shù)研究[J].西安工業(yè)大學(xué)學(xué)報(bào),2014,34(1):34-37.
(責(zé)任編輯:杜能鋼)