Asp.Net 重定向必須要知道的一些資料
更新時(shí)間:2008年12月17日 20:16:24 作者:
ASP.NET資源的請(qǐng)求所經(jīng)過(guò)的處理流程:首先,IIS接收到該請(qǐng)求并將其轉(zhuǎn)交給aspnet_isapi.dll。其次,ASP.NET引擎將一些 HttpModule初始化。
1.1. 概要
如何使用微軟提供的Asp.Net來(lái)對(duì)動(dòng)態(tài)產(chǎn)生的URL地址進(jìn)行網(wǎng)址重寫(xiě)。網(wǎng)址重寫(xiě)是實(shí)現(xiàn)一種截取網(wǎng)址請(qǐng)求并將其進(jìn)行處理后重新指向到一個(gè)指定的網(wǎng)址的過(guò)程。作者本人在對(duì)各種實(shí)現(xiàn)網(wǎng)址重寫(xiě)的技術(shù)進(jìn)行研究和探討后得出的經(jīng)驗(yàn)和方法,希望能對(duì)您有所幫助。
1.2. 內(nèi)容簡(jiǎn)介
稍微花點(diǎn)時(shí)間看類似這樣的地址:http://www.XXX.com/EmployeeInfo.aspx?ID=459&type=summary ,也許你會(huì)出于某種目的把大量的頁(yè)面文件從一個(gè)目錄甚至一個(gè)網(wǎng)站轉(zhuǎn)移到其他地方,而許多訪問(wèn)者出于個(gè)人興趣或者研究目的之前就已經(jīng)將原有網(wǎng)址收藏了起來(lái),如果這時(shí)他從收藏夾打開(kāi)該頁(yè)面的時(shí)候發(fā)現(xiàn)這已經(jīng)是壞鏈了。本文旨在介紹如何使用網(wǎng)址重寫(xiě)將那些“難看”的網(wǎng)址轉(zhuǎn)換成比較有實(shí)際意義的網(wǎng)址,使其便于記憶。例如將http://www.XXX.com/EmployeeInfo.aspx?ID=459&type=summary轉(zhuǎn)換成如下地址:http://www.XXX.com/EmployeeInfo/459/summary.html 。我們甚至發(fā)現(xiàn)網(wǎng)址重寫(xiě)技術(shù)可以解決令人頭疼的404錯(cuò)誤,或者說(shuō)它可以創(chuàng)建一個(gè)智能化的404錯(cuò)誤解決方案。
網(wǎng)址重寫(xiě)是實(shí)現(xiàn)一種截取網(wǎng)址請(qǐng)求并將其進(jìn)行處理后重新指向到一個(gè)指定的網(wǎng)址的過(guò)程。在網(wǎng)址重寫(xiě)執(zhí)行的期間,相應(yīng)處理程序處理被請(qǐng)求的網(wǎng)址,從中提取出相關(guān)的值,然后重新指向一個(gè)新的指定地址。例如:由于一次網(wǎng)站目錄調(diào)整,原有的 /people/ 子目錄下的所有網(wǎng)頁(yè)全部移動(dòng)到/info/employees/目錄,原訪問(wèn)者從收藏夾或者其他什么地方點(diǎn)擊鏈接發(fā)出訪問(wèn)/people/目錄下的文件的請(qǐng)求時(shí),你肯定希望他還是能通過(guò)原有地址看到和原來(lái)相同的頁(yè)面,但實(shí)際上看到的卻是網(wǎng)址重寫(xiě)指向的新目錄下的相應(yīng)文件。
在老版本ASP中,使用網(wǎng)址重寫(xiě)技術(shù)的途徑很少,要么寫(xiě)一個(gè)ISAPI過(guò)濾器,要么購(gòu)買(mǎi)第三方廠商提供的網(wǎng)址重寫(xiě)組件,然而在微軟提供的ASP.NET下你可以通過(guò)多種方法很簡(jiǎn)單地開(kāi)發(fā)出自己的網(wǎng)址重寫(xiě)軟件,以滿足自己各種不同的需要。本文將和你一起討論這門(mén)針對(duì)ASP.NET開(kāi)發(fā)人員的實(shí)現(xiàn)網(wǎng)址重寫(xiě)的技術(shù),然后舉一些網(wǎng)址重寫(xiě)實(shí)際應(yīng)用的例子。在我們深入探討網(wǎng)址重寫(xiě)技術(shù)的細(xì)節(jié)之前,我們先看一下日常使用網(wǎng)址重寫(xiě)技術(shù)實(shí)現(xiàn)的場(chǎng)景。
1.3. 網(wǎng)址重寫(xiě)的一般用途
創(chuàng)建一個(gè)數(shù)據(jù)操作的Asp.Net程序最常見(jiàn)的就是一個(gè)aspx頁(yè)面后面帶上一些查詢參數(shù)集合。例如在設(shè)計(jì)一個(gè)電子商務(wù)網(wǎng)站的時(shí)候,假定你設(shè)計(jì)了一項(xiàng)功能允許用戶瀏覽待售的商品,為了更加方便操作,你設(shè)計(jì)了一個(gè)頁(yè)面Category.aspx將商品按照給定的分類顯示,那么該分類下的商品顯示頁(yè)面上應(yīng)該在頁(yè)面文件對(duì)應(yīng)網(wǎng)址后面加上了一個(gè)商品分類的查詢參數(shù),例如用戶要查詢待售的“裝飾品”,在數(shù)據(jù)庫(kù)中所有的裝飾品數(shù)據(jù)對(duì)應(yīng)的分類編號(hào)CategoryID的值為5,那么用戶會(huì)訪問(wèn)如下網(wǎng)址:http://www.XXX.com/Category.aspx?CategoryID=5。
創(chuàng)建一個(gè)包含類似這樣網(wǎng)址的網(wǎng)站最終有兩種結(jié)果,首先從最終用戶的角度來(lái)觀察,http://://www.XXX.com/Category.aspx?CategoryID=5 這個(gè)網(wǎng)址有些雜亂,可行性分析專家Jakob Neilson建議選擇網(wǎng)址顯示方式時(shí)候考慮如下要求:
● 是否簡(jiǎn)短
● 是否易于輸入
● 是否將站點(diǎn)結(jié)構(gòu)形象化
● 是否具有隱蔽性,也就是讓用戶通過(guò)一個(gè)虛擬的看似有意義的導(dǎo)航地址訪問(wèn)指向該地址
我想還應(yīng)該在上述列表中再增加一條:是否便于記憶。http://www.XXX.com/Category.aspx?CategoryID=5 這個(gè)地址沒(méi)有一個(gè)地方符合Neilson標(biāo)準(zhǔn)的任何一條,也不便于記憶。當(dāng)然,對(duì)于有經(jīng)驗(yàn)的網(wǎng)絡(luò)開(kāi)發(fā)專家來(lái)說(shuō),他們很熟悉這種鍵值對(duì)構(gòu)成的查詢參數(shù)結(jié)構(gòu)體系,然而對(duì)于普通用戶來(lái)說(shuō)輸入這些帶有參數(shù)的網(wǎng)址實(shí)在是太麻煩了。
一種較好的方法就是使用一種比較直觀且容易記憶的方式來(lái)將網(wǎng)址表示為:http://www.XXX.com/products/Widgets 乍一看很容易就會(huì)推斷這個(gè)網(wǎng)址所對(duì)應(yīng)的內(nèi)容極有可能會(huì)是顯示裝飾品(Widgets)信息,這個(gè)網(wǎng)址就變得更加容易記憶和傳播!然后我告訴我的同事:“請(qǐng)查看這個(gè)網(wǎng)址:http://://www.XXX.com/products/widgets ”不用我說(shuō)第二遍,她可能一次就把地址敲到瀏覽器上了。很快就瀏覽器上就列出了裝飾品(Widgets)的內(nèi)容。這里“隱蔽性”表示:用戶可以自行變更網(wǎng)址的結(jié)尾,例如輸入:http://www.XXX.com/products 就能看到全部分類相關(guān)的商品列表或者列出所有相關(guān)商品分類目錄列表。
注:用上述簡(jiǎn)單的變更網(wǎng)址內(nèi)容的方法來(lái)構(gòu)思一下如今的比較流行的Blog網(wǎng)站生成的網(wǎng)址。例如:要查詢2004年1月28日所發(fā)的帖子,只需輸入 http://someblog.com/2004/01/28 即可,如果將網(wǎng)址裁減為 http://someblog.com/2004/01 則顯示 2004年1月份的帖子 ,同樣將月份裁減掉得到 http://someblog.com/2004 則顯示出2004年全年所發(fā)的帖子。
網(wǎng)址重寫(xiě)技術(shù)除了用于將復(fù)雜的網(wǎng)址簡(jiǎn)單化之外,它還能用于處理因網(wǎng)站目錄調(diào)整或者其他原因?qū)е庐a(chǎn)生大量的無(wú)效鏈接和過(guò)期書(shū)簽。
1.4. 當(dāng)一個(gè)Web請(qǐng)求傳送到IIS會(huì)發(fā)生什么?
在探討如何實(shí)現(xiàn)網(wǎng)址重寫(xiě)這項(xiàng)技術(shù)之前,很有必要了解一下IIS是處理所接收的Web請(qǐng)求的機(jī)制。當(dāng)一個(gè)Web請(qǐng)求到達(dá)IIS Web服務(wù)器時(shí),IIS會(huì)根據(jù)所請(qǐng)求的文件后綴名來(lái)決定如何處理該請(qǐng)求,IIS可以處理諸如HTML頁(yè)面、圖片、靜態(tài)內(nèi)容,或者將請(qǐng)求轉(zhuǎn)發(fā)給ISAPI應(yīng)用程序,由該ISAPI應(yīng)用程序處理后生成HTML靜態(tài)內(nèi)容返回給IIS,最后由IIS將請(qǐng)求結(jié)果發(fā)送回給客戶端。(一個(gè)ISAPI應(yīng)用程序就是一套編譯好能隨時(shí)在后臺(tái)運(yùn)行的類庫(kù),它的任務(wù)就是根據(jù)請(qǐng)求生成相關(guān)的內(nèi)容。)
例如:如果IIS接收到一個(gè)對(duì)Info.asp的請(qǐng)求,它會(huì)將該請(qǐng)求轉(zhuǎn)交給asp.dll來(lái)處理,該ISAPI應(yīng)用程序調(diào)出并執(zhí)行所請(qǐng)求的ASP頁(yè)面,然后把生成的HTML代碼返回給IIS,IIS最后把內(nèi)容發(fā)送回請(qǐng)求客戶端。對(duì)于ASP.NET頁(yè)面,IIS則將請(qǐng)求轉(zhuǎn)交給名為 aspnet_isapi.dll的ISAPI應(yīng)用程序來(lái)處理,該ISAPI應(yīng)用程序調(diào)用托管的Asp.Net工作進(jìn)程來(lái)處理該請(qǐng)求,并將生成的HTML 代碼返回給請(qǐng)求客戶端。你可以自定義IIS,將某一類擴(kuò)展名映射到指定的ISAPI應(yīng)用程序。
關(guān)于對(duì)IIS如何管理所接收的請(qǐng)求的詳細(xì)探討有些超出本文內(nèi)容,想了解的更詳細(xì)的話可以參考Michele Leroux Bustamante的著作Inside IIS and ASP.NET(深入研究IIS與ASP.NET),重要的是要了解Asp.Net引擎只負(fù)責(zé)處理對(duì)擴(kuò)展名已經(jīng)被正確配置映射到aspnet_isapi.dll的網(wǎng)絡(luò)請(qǐng)求。
1.5. 用ISAPI過(guò)濾器來(lái)分析請(qǐng)求
除了將請(qǐng)求的文件擴(kuò)展名映射到相應(yīng)的ISAPI應(yīng)用程序外,IIS還執(zhí)行一些其他工作。例如IIS還主動(dòng)對(duì)發(fā)出請(qǐng)求的客戶端用戶進(jìn)行授權(quán),并判斷已授權(quán)用戶是否對(duì)其請(qǐng)求的文件擁有訪問(wèn)權(quán)限,在一個(gè)請(qǐng)求過(guò)程的全部生命期內(nèi),IIS的處理經(jīng)歷了幾個(gè)階段,在每一個(gè)階段IIS都生成一個(gè)事件,而該事件可以被 ISAPI過(guò)濾器實(shí)時(shí)操控的。
如同ISAPI應(yīng)用程序一樣,ISAPI過(guò)濾器也是一塊塊安裝在Web服務(wù)器上的非托管代碼。ISAPI應(yīng)用程序用于對(duì)所接收的特定文件類型做出響應(yīng),而 ISAPI過(guò)濾器含有對(duì)IIS生成的事件做出響應(yīng)的代碼(contain Code),甚至可以編輯進(jìn)出的數(shù)據(jù)。ISAPI也含有眾多應(yīng)用程序,包括:
● 權(quán)限控制與授權(quán)(Authentication and Authorization)
● 日志記錄與監(jiān)視(Logging and Monitoring)
● HTTP內(nèi)容壓縮(HTTP Compression)
● 網(wǎng)址重寫(xiě)(URL Rewriting)
本文所探討的用Asp.Net實(shí)現(xiàn)的網(wǎng)址重寫(xiě)技術(shù)就是基于ISAPI過(guò)濾器用于網(wǎng)址重寫(xiě)的技術(shù)內(nèi)容,然而我們?nèi)匀灰懻撘幌戮烤故鞘褂肐SAPI過(guò)濾器還是使用ASP.NET應(yīng)用程序提供的技術(shù)來(lái)實(shí)現(xiàn)網(wǎng)址重寫(xiě)技術(shù)。
1.6. 當(dāng)一個(gè)請(qǐng)求傳入Asp.Net引擎的時(shí)候會(huì)發(fā)生什么?
Asp.Net問(wèn)世之前,在IIS Web服務(wù)器上的網(wǎng)址重寫(xiě)功能需要通過(guò)ISAPI過(guò)濾器來(lái)實(shí)現(xiàn),自從這個(gè)家伙問(wèn)世后我們就能通過(guò)ASP.NET來(lái)實(shí)現(xiàn)URL重寫(xiě)了,因?yàn)锳SP.NET的解釋引擎與IIS有極大的相似之處,產(chǎn)生這些相似性主要是因?yàn)锳SP.NET:
● 在處理接收的請(qǐng)求的生命期內(nèi)也會(huì)產(chǎn)生事件;
● 允許任意數(shù)量的HttpModule操控產(chǎn)生的事件,這與IIS中的ISAPI過(guò)濾器類似;
● 將請(qǐng)求的資源委托給HttpHandler處理,這與IIS中的ISAPI應(yīng)用程序類似。
和IIS一樣,在一個(gè)請(qǐng)求的整個(gè)生命期內(nèi),Asp.Net對(duì)該請(qǐng)求的處理狀態(tài)發(fā)出的狀態(tài)改變信號(hào)引發(fā)相應(yīng)的事件。例如:BeginRequest事件在 Asp.Net開(kāi)始響應(yīng)客戶端請(qǐng)求之始引發(fā);AuthenticateRequest事件在Asp.Net確立用戶身份后引發(fā),當(dāng)然還有諸如 AuthorizeRequest,ResolveRequestCache和EndRequest等其它很多事件,這些都是 System.Web.HttpApplication類下的事件,更多信息請(qǐng)參考技術(shù)文檔中的類HttpApplication概要(HttpApplication Class Overview)。
如上所述,可以創(chuàng)建ISAPI過(guò)濾器并用于相應(yīng)IIS引發(fā)的事件,同理,Asp.Net也提供了HttpModule用于響應(yīng)ASP.NET引擎引發(fā)的事件,一個(gè)ASP.NET應(yīng)用程序通過(guò)配置可以擁有多個(gè)HttpModule。ASP.NET引擎每處理一個(gè)請(qǐng)求,便初始化一個(gè)相應(yīng)配置好的 HttpModule,并允許它針對(duì)請(qǐng)求處理期間引發(fā)的事件生成相應(yīng)的事件委托。事實(shí)上ASP.NET引擎處理每一個(gè)請(qǐng)求調(diào)用大量的事件委托。 FormsAuthenticationModule就是眾多內(nèi)嵌HttpModule中的一個(gè),它首先檢查是否使用表單授權(quán),如果是的話,它將檢查用戶是否已授權(quán),如果沒(méi)有授權(quán)則自動(dòng)把用戶重定向到指定的登錄頁(yè)面。
回憶在IIS中,一項(xiàng)請(qǐng)求最后被轉(zhuǎn)交給一個(gè)ISAPI應(yīng)用程序處理,該應(yīng)用程序針對(duì)每一項(xiàng)請(qǐng)求進(jìn)行處理并返回相應(yīng)的數(shù)據(jù)。例如,客戶端發(fā)出一個(gè)訪問(wèn)經(jīng)典 ASP頁(yè)面的請(qǐng)求,IIS將該請(qǐng)求轉(zhuǎn)交給asp.dll程序處理,asp.dll針對(duì)該請(qǐng)求執(zhí)行asp頁(yè)面內(nèi)容,并返回HTML編碼。ASP.NET也使用了類似的手法,ASP.NET引擎在將這些HttpModule初始化后,判斷并決定調(diào)用相應(yīng)的HttpModule來(lái)處理該請(qǐng)求。
所有通過(guò)ASP.NET引擎解析的請(qǐng)求最終被送交一個(gè)HttpHandler或者HttpHandlerFactory(一個(gè)HttpHandler只是簡(jiǎn)單地返回一個(gè)用于處理該請(qǐng)求的HttpHandler的實(shí)例。)最終的委托呈現(xiàn)并響應(yīng)所請(qǐng)求的HTML編碼,并發(fā)送回IIS,IIS則將HTML返回給請(qǐng)求客戶端。
ASP.NET包含許多HttpHandler,例如,PageHandlerFactory是用于呈現(xiàn)ASP.NET頁(yè)面內(nèi)容, WebServiceHandlerFactory用于呈現(xiàn)ASP.NET Web服務(wù)的SOAP數(shù)據(jù)包,TraceHandler用于將ASP.NET請(qǐng)求資源的HTML標(biāo)記寫(xiě)入trace.axd。
ASP.NET資源的請(qǐng)求所經(jīng)過(guò)的處理流程:首先,IIS接收到該請(qǐng)求并將其轉(zhuǎn)交給aspnet_isapi.dll。其次,ASP.NET引擎將一些 HttpModule初始化。最后,最終的HttpHandler被調(diào)用,生成相應(yīng)的標(biāo)記語(yǔ)言,并將其返回給IIS,最終返回到請(qǐng)求客戶端。
如何使用微軟提供的Asp.Net來(lái)對(duì)動(dòng)態(tài)產(chǎn)生的URL地址進(jìn)行網(wǎng)址重寫(xiě)。網(wǎng)址重寫(xiě)是實(shí)現(xiàn)一種截取網(wǎng)址請(qǐng)求并將其進(jìn)行處理后重新指向到一個(gè)指定的網(wǎng)址的過(guò)程。作者本人在對(duì)各種實(shí)現(xiàn)網(wǎng)址重寫(xiě)的技術(shù)進(jìn)行研究和探討后得出的經(jīng)驗(yàn)和方法,希望能對(duì)您有所幫助。
1.2. 內(nèi)容簡(jiǎn)介
稍微花點(diǎn)時(shí)間看類似這樣的地址:http://www.XXX.com/EmployeeInfo.aspx?ID=459&type=summary ,也許你會(huì)出于某種目的把大量的頁(yè)面文件從一個(gè)目錄甚至一個(gè)網(wǎng)站轉(zhuǎn)移到其他地方,而許多訪問(wèn)者出于個(gè)人興趣或者研究目的之前就已經(jīng)將原有網(wǎng)址收藏了起來(lái),如果這時(shí)他從收藏夾打開(kāi)該頁(yè)面的時(shí)候發(fā)現(xiàn)這已經(jīng)是壞鏈了。本文旨在介紹如何使用網(wǎng)址重寫(xiě)將那些“難看”的網(wǎng)址轉(zhuǎn)換成比較有實(shí)際意義的網(wǎng)址,使其便于記憶。例如將http://www.XXX.com/EmployeeInfo.aspx?ID=459&type=summary轉(zhuǎn)換成如下地址:http://www.XXX.com/EmployeeInfo/459/summary.html 。我們甚至發(fā)現(xiàn)網(wǎng)址重寫(xiě)技術(shù)可以解決令人頭疼的404錯(cuò)誤,或者說(shuō)它可以創(chuàng)建一個(gè)智能化的404錯(cuò)誤解決方案。
網(wǎng)址重寫(xiě)是實(shí)現(xiàn)一種截取網(wǎng)址請(qǐng)求并將其進(jìn)行處理后重新指向到一個(gè)指定的網(wǎng)址的過(guò)程。在網(wǎng)址重寫(xiě)執(zhí)行的期間,相應(yīng)處理程序處理被請(qǐng)求的網(wǎng)址,從中提取出相關(guān)的值,然后重新指向一個(gè)新的指定地址。例如:由于一次網(wǎng)站目錄調(diào)整,原有的 /people/ 子目錄下的所有網(wǎng)頁(yè)全部移動(dòng)到/info/employees/目錄,原訪問(wèn)者從收藏夾或者其他什么地方點(diǎn)擊鏈接發(fā)出訪問(wèn)/people/目錄下的文件的請(qǐng)求時(shí),你肯定希望他還是能通過(guò)原有地址看到和原來(lái)相同的頁(yè)面,但實(shí)際上看到的卻是網(wǎng)址重寫(xiě)指向的新目錄下的相應(yīng)文件。
在老版本ASP中,使用網(wǎng)址重寫(xiě)技術(shù)的途徑很少,要么寫(xiě)一個(gè)ISAPI過(guò)濾器,要么購(gòu)買(mǎi)第三方廠商提供的網(wǎng)址重寫(xiě)組件,然而在微軟提供的ASP.NET下你可以通過(guò)多種方法很簡(jiǎn)單地開(kāi)發(fā)出自己的網(wǎng)址重寫(xiě)軟件,以滿足自己各種不同的需要。本文將和你一起討論這門(mén)針對(duì)ASP.NET開(kāi)發(fā)人員的實(shí)現(xiàn)網(wǎng)址重寫(xiě)的技術(shù),然后舉一些網(wǎng)址重寫(xiě)實(shí)際應(yīng)用的例子。在我們深入探討網(wǎng)址重寫(xiě)技術(shù)的細(xì)節(jié)之前,我們先看一下日常使用網(wǎng)址重寫(xiě)技術(shù)實(shí)現(xiàn)的場(chǎng)景。
1.3. 網(wǎng)址重寫(xiě)的一般用途
創(chuàng)建一個(gè)數(shù)據(jù)操作的Asp.Net程序最常見(jiàn)的就是一個(gè)aspx頁(yè)面后面帶上一些查詢參數(shù)集合。例如在設(shè)計(jì)一個(gè)電子商務(wù)網(wǎng)站的時(shí)候,假定你設(shè)計(jì)了一項(xiàng)功能允許用戶瀏覽待售的商品,為了更加方便操作,你設(shè)計(jì)了一個(gè)頁(yè)面Category.aspx將商品按照給定的分類顯示,那么該分類下的商品顯示頁(yè)面上應(yīng)該在頁(yè)面文件對(duì)應(yīng)網(wǎng)址后面加上了一個(gè)商品分類的查詢參數(shù),例如用戶要查詢待售的“裝飾品”,在數(shù)據(jù)庫(kù)中所有的裝飾品數(shù)據(jù)對(duì)應(yīng)的分類編號(hào)CategoryID的值為5,那么用戶會(huì)訪問(wèn)如下網(wǎng)址:http://www.XXX.com/Category.aspx?CategoryID=5。
創(chuàng)建一個(gè)包含類似這樣網(wǎng)址的網(wǎng)站最終有兩種結(jié)果,首先從最終用戶的角度來(lái)觀察,http://://www.XXX.com/Category.aspx?CategoryID=5 這個(gè)網(wǎng)址有些雜亂,可行性分析專家Jakob Neilson建議選擇網(wǎng)址顯示方式時(shí)候考慮如下要求:
● 是否簡(jiǎn)短
● 是否易于輸入
● 是否將站點(diǎn)結(jié)構(gòu)形象化
● 是否具有隱蔽性,也就是讓用戶通過(guò)一個(gè)虛擬的看似有意義的導(dǎo)航地址訪問(wèn)指向該地址
我想還應(yīng)該在上述列表中再增加一條:是否便于記憶。http://www.XXX.com/Category.aspx?CategoryID=5 這個(gè)地址沒(méi)有一個(gè)地方符合Neilson標(biāo)準(zhǔn)的任何一條,也不便于記憶。當(dāng)然,對(duì)于有經(jīng)驗(yàn)的網(wǎng)絡(luò)開(kāi)發(fā)專家來(lái)說(shuō),他們很熟悉這種鍵值對(duì)構(gòu)成的查詢參數(shù)結(jié)構(gòu)體系,然而對(duì)于普通用戶來(lái)說(shuō)輸入這些帶有參數(shù)的網(wǎng)址實(shí)在是太麻煩了。
一種較好的方法就是使用一種比較直觀且容易記憶的方式來(lái)將網(wǎng)址表示為:http://www.XXX.com/products/Widgets 乍一看很容易就會(huì)推斷這個(gè)網(wǎng)址所對(duì)應(yīng)的內(nèi)容極有可能會(huì)是顯示裝飾品(Widgets)信息,這個(gè)網(wǎng)址就變得更加容易記憶和傳播!然后我告訴我的同事:“請(qǐng)查看這個(gè)網(wǎng)址:http://://www.XXX.com/products/widgets ”不用我說(shuō)第二遍,她可能一次就把地址敲到瀏覽器上了。很快就瀏覽器上就列出了裝飾品(Widgets)的內(nèi)容。這里“隱蔽性”表示:用戶可以自行變更網(wǎng)址的結(jié)尾,例如輸入:http://www.XXX.com/products 就能看到全部分類相關(guān)的商品列表或者列出所有相關(guān)商品分類目錄列表。
注:用上述簡(jiǎn)單的變更網(wǎng)址內(nèi)容的方法來(lái)構(gòu)思一下如今的比較流行的Blog網(wǎng)站生成的網(wǎng)址。例如:要查詢2004年1月28日所發(fā)的帖子,只需輸入 http://someblog.com/2004/01/28 即可,如果將網(wǎng)址裁減為 http://someblog.com/2004/01 則顯示 2004年1月份的帖子 ,同樣將月份裁減掉得到 http://someblog.com/2004 則顯示出2004年全年所發(fā)的帖子。
網(wǎng)址重寫(xiě)技術(shù)除了用于將復(fù)雜的網(wǎng)址簡(jiǎn)單化之外,它還能用于處理因網(wǎng)站目錄調(diào)整或者其他原因?qū)е庐a(chǎn)生大量的無(wú)效鏈接和過(guò)期書(shū)簽。
1.4. 當(dāng)一個(gè)Web請(qǐng)求傳送到IIS會(huì)發(fā)生什么?
在探討如何實(shí)現(xiàn)網(wǎng)址重寫(xiě)這項(xiàng)技術(shù)之前,很有必要了解一下IIS是處理所接收的Web請(qǐng)求的機(jī)制。當(dāng)一個(gè)Web請(qǐng)求到達(dá)IIS Web服務(wù)器時(shí),IIS會(huì)根據(jù)所請(qǐng)求的文件后綴名來(lái)決定如何處理該請(qǐng)求,IIS可以處理諸如HTML頁(yè)面、圖片、靜態(tài)內(nèi)容,或者將請(qǐng)求轉(zhuǎn)發(fā)給ISAPI應(yīng)用程序,由該ISAPI應(yīng)用程序處理后生成HTML靜態(tài)內(nèi)容返回給IIS,最后由IIS將請(qǐng)求結(jié)果發(fā)送回給客戶端。(一個(gè)ISAPI應(yīng)用程序就是一套編譯好能隨時(shí)在后臺(tái)運(yùn)行的類庫(kù),它的任務(wù)就是根據(jù)請(qǐng)求生成相關(guān)的內(nèi)容。)
例如:如果IIS接收到一個(gè)對(duì)Info.asp的請(qǐng)求,它會(huì)將該請(qǐng)求轉(zhuǎn)交給asp.dll來(lái)處理,該ISAPI應(yīng)用程序調(diào)出并執(zhí)行所請(qǐng)求的ASP頁(yè)面,然后把生成的HTML代碼返回給IIS,IIS最后把內(nèi)容發(fā)送回請(qǐng)求客戶端。對(duì)于ASP.NET頁(yè)面,IIS則將請(qǐng)求轉(zhuǎn)交給名為 aspnet_isapi.dll的ISAPI應(yīng)用程序來(lái)處理,該ISAPI應(yīng)用程序調(diào)用托管的Asp.Net工作進(jìn)程來(lái)處理該請(qǐng)求,并將生成的HTML 代碼返回給請(qǐng)求客戶端。你可以自定義IIS,將某一類擴(kuò)展名映射到指定的ISAPI應(yīng)用程序。
關(guān)于對(duì)IIS如何管理所接收的請(qǐng)求的詳細(xì)探討有些超出本文內(nèi)容,想了解的更詳細(xì)的話可以參考Michele Leroux Bustamante的著作Inside IIS and ASP.NET(深入研究IIS與ASP.NET),重要的是要了解Asp.Net引擎只負(fù)責(zé)處理對(duì)擴(kuò)展名已經(jīng)被正確配置映射到aspnet_isapi.dll的網(wǎng)絡(luò)請(qǐng)求。
1.5. 用ISAPI過(guò)濾器來(lái)分析請(qǐng)求
除了將請(qǐng)求的文件擴(kuò)展名映射到相應(yīng)的ISAPI應(yīng)用程序外,IIS還執(zhí)行一些其他工作。例如IIS還主動(dòng)對(duì)發(fā)出請(qǐng)求的客戶端用戶進(jìn)行授權(quán),并判斷已授權(quán)用戶是否對(duì)其請(qǐng)求的文件擁有訪問(wèn)權(quán)限,在一個(gè)請(qǐng)求過(guò)程的全部生命期內(nèi),IIS的處理經(jīng)歷了幾個(gè)階段,在每一個(gè)階段IIS都生成一個(gè)事件,而該事件可以被 ISAPI過(guò)濾器實(shí)時(shí)操控的。
如同ISAPI應(yīng)用程序一樣,ISAPI過(guò)濾器也是一塊塊安裝在Web服務(wù)器上的非托管代碼。ISAPI應(yīng)用程序用于對(duì)所接收的特定文件類型做出響應(yīng),而 ISAPI過(guò)濾器含有對(duì)IIS生成的事件做出響應(yīng)的代碼(contain Code),甚至可以編輯進(jìn)出的數(shù)據(jù)。ISAPI也含有眾多應(yīng)用程序,包括:
● 權(quán)限控制與授權(quán)(Authentication and Authorization)
● 日志記錄與監(jiān)視(Logging and Monitoring)
● HTTP內(nèi)容壓縮(HTTP Compression)
● 網(wǎng)址重寫(xiě)(URL Rewriting)
本文所探討的用Asp.Net實(shí)現(xiàn)的網(wǎng)址重寫(xiě)技術(shù)就是基于ISAPI過(guò)濾器用于網(wǎng)址重寫(xiě)的技術(shù)內(nèi)容,然而我們?nèi)匀灰懻撘幌戮烤故鞘褂肐SAPI過(guò)濾器還是使用ASP.NET應(yīng)用程序提供的技術(shù)來(lái)實(shí)現(xiàn)網(wǎng)址重寫(xiě)技術(shù)。
1.6. 當(dāng)一個(gè)請(qǐng)求傳入Asp.Net引擎的時(shí)候會(huì)發(fā)生什么?
Asp.Net問(wèn)世之前,在IIS Web服務(wù)器上的網(wǎng)址重寫(xiě)功能需要通過(guò)ISAPI過(guò)濾器來(lái)實(shí)現(xiàn),自從這個(gè)家伙問(wèn)世后我們就能通過(guò)ASP.NET來(lái)實(shí)現(xiàn)URL重寫(xiě)了,因?yàn)锳SP.NET的解釋引擎與IIS有極大的相似之處,產(chǎn)生這些相似性主要是因?yàn)锳SP.NET:
● 在處理接收的請(qǐng)求的生命期內(nèi)也會(huì)產(chǎn)生事件;
● 允許任意數(shù)量的HttpModule操控產(chǎn)生的事件,這與IIS中的ISAPI過(guò)濾器類似;
● 將請(qǐng)求的資源委托給HttpHandler處理,這與IIS中的ISAPI應(yīng)用程序類似。
和IIS一樣,在一個(gè)請(qǐng)求的整個(gè)生命期內(nèi),Asp.Net對(duì)該請(qǐng)求的處理狀態(tài)發(fā)出的狀態(tài)改變信號(hào)引發(fā)相應(yīng)的事件。例如:BeginRequest事件在 Asp.Net開(kāi)始響應(yīng)客戶端請(qǐng)求之始引發(fā);AuthenticateRequest事件在Asp.Net確立用戶身份后引發(fā),當(dāng)然還有諸如 AuthorizeRequest,ResolveRequestCache和EndRequest等其它很多事件,這些都是 System.Web.HttpApplication類下的事件,更多信息請(qǐng)參考技術(shù)文檔中的類HttpApplication概要(HttpApplication Class Overview)。
如上所述,可以創(chuàng)建ISAPI過(guò)濾器并用于相應(yīng)IIS引發(fā)的事件,同理,Asp.Net也提供了HttpModule用于響應(yīng)ASP.NET引擎引發(fā)的事件,一個(gè)ASP.NET應(yīng)用程序通過(guò)配置可以擁有多個(gè)HttpModule。ASP.NET引擎每處理一個(gè)請(qǐng)求,便初始化一個(gè)相應(yīng)配置好的 HttpModule,并允許它針對(duì)請(qǐng)求處理期間引發(fā)的事件生成相應(yīng)的事件委托。事實(shí)上ASP.NET引擎處理每一個(gè)請(qǐng)求調(diào)用大量的事件委托。 FormsAuthenticationModule就是眾多內(nèi)嵌HttpModule中的一個(gè),它首先檢查是否使用表單授權(quán),如果是的話,它將檢查用戶是否已授權(quán),如果沒(méi)有授權(quán)則自動(dòng)把用戶重定向到指定的登錄頁(yè)面。
回憶在IIS中,一項(xiàng)請(qǐng)求最后被轉(zhuǎn)交給一個(gè)ISAPI應(yīng)用程序處理,該應(yīng)用程序針對(duì)每一項(xiàng)請(qǐng)求進(jìn)行處理并返回相應(yīng)的數(shù)據(jù)。例如,客戶端發(fā)出一個(gè)訪問(wèn)經(jīng)典 ASP頁(yè)面的請(qǐng)求,IIS將該請(qǐng)求轉(zhuǎn)交給asp.dll程序處理,asp.dll針對(duì)該請(qǐng)求執(zhí)行asp頁(yè)面內(nèi)容,并返回HTML編碼。ASP.NET也使用了類似的手法,ASP.NET引擎在將這些HttpModule初始化后,判斷并決定調(diào)用相應(yīng)的HttpModule來(lái)處理該請(qǐng)求。
所有通過(guò)ASP.NET引擎解析的請(qǐng)求最終被送交一個(gè)HttpHandler或者HttpHandlerFactory(一個(gè)HttpHandler只是簡(jiǎn)單地返回一個(gè)用于處理該請(qǐng)求的HttpHandler的實(shí)例。)最終的委托呈現(xiàn)并響應(yīng)所請(qǐng)求的HTML編碼,并發(fā)送回IIS,IIS則將HTML返回給請(qǐng)求客戶端。
ASP.NET包含許多HttpHandler,例如,PageHandlerFactory是用于呈現(xiàn)ASP.NET頁(yè)面內(nèi)容, WebServiceHandlerFactory用于呈現(xiàn)ASP.NET Web服務(wù)的SOAP數(shù)據(jù)包,TraceHandler用于將ASP.NET請(qǐng)求資源的HTML標(biāo)記寫(xiě)入trace.axd。
ASP.NET資源的請(qǐng)求所經(jīng)過(guò)的處理流程:首先,IIS接收到該請(qǐng)求并將其轉(zhuǎn)交給aspnet_isapi.dll。其次,ASP.NET引擎將一些 HttpModule初始化。最后,最終的HttpHandler被調(diào)用,生成相應(yīng)的標(biāo)記語(yǔ)言,并將其返回給IIS,最終返回到請(qǐng)求客戶端。
您可能感興趣的文章:
- ASP.NET MVC頁(yè)面重定向簡(jiǎn)單介紹
- 詳解SpringMVC重定向傳參數(shù)的實(shí)現(xiàn)
- ASP.NET MVC3 實(shí)現(xiàn)全站重定向的簡(jiǎn)單方法
- asp.net RewritePath重定向HTTP頭Content-Location暴露真實(shí)路徑解決方法
- Asp.Net實(shí)現(xiàn)404頁(yè)面與301重定向的方法
- Windows虛擬主機(jī)與VPS如何實(shí)現(xiàn)301重定向(asp.net)
- 301重定向代碼合集(iis,asp,php,asp.net,apache)
- asp.net php asp jsp 301重定向的代碼(集合)
- ASP.NET 重定向的幾種方法小結(jié)
- mvc重定向方式詳解
相關(guān)文章
.Net Core導(dǎo)入千萬(wàn)級(jí)數(shù)據(jù)至Mysql數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
今天我們談?wù)凪ySQL怎么高性能插入千萬(wàn)級(jí)的數(shù)據(jù)的,討論這個(gè)問(wèn)題牽扯到一個(gè)數(shù)據(jù)遷移功能,高性能的插入數(shù)據(jù),接下來(lái)通過(guò)本文給大家分享幾種實(shí)現(xiàn)方法,感興趣的朋友跟隨小編一起學(xué)習(xí)下吧2021-05-05讓Asp.NET的DataGrid可排序、可選擇、可分頁(yè)
讓Asp.NET的DataGrid可排序、可選擇、可分頁(yè)...2007-02-02ASP.NET中防止頁(yè)面刷新造成表單重復(fù)提交執(zhí)行兩次操作
本文主要介紹在Session存儲(chǔ)唯一標(biāo)識(shí)Token,通過(guò)和后臺(tái)對(duì)比,以實(shí)現(xiàn)防止刷新提交表單的問(wèn)題。2016-04-04ASP.NET 清除模式窗口數(shù)據(jù)緩存的操作方式
模式窗口showModalDialog()彈出頁(yè)面在asp.net中經(jīng)常用到,接下來(lái)為大家介紹下清除模式窗口緩存數(shù)據(jù)的問(wèn)題2013-04-04.NET使用DinkToPdf將HTML轉(zhuǎn)成PDF的示例代碼
這篇文章主要介紹了.NET使用DinkToPdf將HTML轉(zhuǎn)成PDF的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Asp.net core Web Api配置swagger中文的實(shí)現(xiàn)
swagger是一個(gè)api文檔自動(dòng)生動(dòng)工具,還集成了在線調(diào)試. 可以為項(xiàng)目自動(dòng)生成接口文檔, 非常的方便快捷,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09asp.net實(shí)現(xiàn)將ppt文檔轉(zhuǎn)換成pdf的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)將ppt文檔轉(zhuǎn)換成pdf的方法,通過(guò)自定義函數(shù)實(shí)現(xiàn)將pptx格式的文件轉(zhuǎn)換成pdf格式文件的功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11