前言
前面有2篇帖子提到了關(guān)于URL Routing的特性,但是發(fā)現(xiàn)有很多人誤會URL Routing就是URl Rewriting,其實(shí)2個(gè)雖然都提供相似的功能(提高友好的URL方便搜索引起收錄),但是2者的原理和運(yùn)行周期是完全不一樣的,本篇文章我們就來分析一下具體有什么不同。
例子
在分析原理之前,我們先來做一個(gè)例子測試一下(IIS URL Rewrite模塊需要IIS7的支持)。
1.為Customer/1的URL建立對應(yīng)的MVC程序
首先建立一個(gè)普通的MVC3程序,建立一個(gè)簡單的CustomerController以及一個(gè)簡單的Detail action,代碼如下:
public class CustomerController : Controller
{
public ActionResult Detail(string id)
{
ViewBag.CustomerID = id;
return View();
}
}
我們只是簡單的接受一個(gè)ID,然后放到ViewBag里以便在view里顯示,view的代碼如下:
@{
Layout = null;
}
!DOCTYPE html>
html>
head>
title>Detail/title>
/head>
body>
div>
MVC下運(yùn)行結(jié)果:@ViewBag.CustomerID
/div>
/body>
/html>
2.為Customer/1的URL建立對應(yīng)的web form程序
在同一個(gè)解決方案的根目錄下,建立一個(gè)Customer.aspx文件,文件代碼主要是接受一個(gè)ID參數(shù)然后顯示在頁面上,代碼:
public partial class Customer : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.lblId.InnerText = Request.QueryString["id"];
}
}
html:
form id="form1" runat="server">
div>
asp.net web form下是:label runat="server" id="lblId">/label>
/div>
/form>
OK,我們先在Global.asax.cs里配置Customre/1的route,代碼如下:
routes.MapRoute(
"CustomerDetail", // Route name
"Customer/{id}", // URL with parameters
new { controller = "Customer", action = "Detail", id = UrlParameter.Optional }
);
編譯訪問,運(yùn)行http://localhost/customer/123,頁面顯示結(jié)果是:
MVC下運(yùn)行結(jié)果:123。
3.安裝IIS URL Rewrite
到如下地址下載并安裝IIS URL Rewrite,http://www.iis.net/download/URLRewrite 成功安裝以后,在MVC項(xiàng)目的web.config里配置一條URL重寫規(guī)則,代碼如下(注意是system.webServer節(jié)點(diǎn)哦):
system.webServer>
validation validateIntegratedModeConfiguration="false"/>
modules runAllManagedModulesForAllRequests="true"/>
directoryBrowse enabled="true" />
rewrite>
rules>
rule name="rewrite customer">
match url="^customer/([0-9]+)" />
action type="Rewrite" url="customer.aspx?id={R:1}" />
/rule>
/rules>
/rewrite>
/system.webServer>
該規(guī)則的意思是,將customer/1類似的請求重寫到customer.aspx?id=1上,我們編譯程序再來訪問以下http://localhost/customer/123,頁面顯示結(jié)果如下:
asp.net web form下是:123
也就是說Routing在這個(gè)時(shí)候沒起作用,因?yàn)閁RL Rewrite是在Routing之前將Customer/123這個(gè)地址轉(zhuǎn)發(fā)到了Customer.aspx?id=123,由aspx文件接收請求了。我們來看看2者之間到底都是在什么周期處理的。
原理周期
1. URL Rewrite
關(guān)于URL Rewrite最早見于apache web server,當(dāng)時(shí)風(fēng)靡一時(shí)的url重寫讓一大批使用php的人欣喜若狂啊,可惜之前由于asp.net下的實(shí)現(xiàn)方式特別復(fù)雜,所以很多站的基本上都沒怎么用,自從IIS.net推出正式的IIS URL Rewrite模塊以來,徹底解決了這一問題。
URL Rewrite是在request-processing pipeline的早期階段執(zhí)行的,一般一個(gè)地址進(jìn)來以后,該模塊會根據(jù)規(guī)則來映射到同一服務(wù)器上的另外一條新的地址,新地址在處理的時(shí)候所接受的參數(shù)和數(shù)據(jù)都是一句新地址的參數(shù)來判斷的,就比如customer.aspx?id=123,而 request里的url也是新的地址,而不是重寫之前的地址,不過用戶本身感覺不到變化,因?yàn)闉g覽器上顯示的一直是舊URL,我們來看一下他的周期圖。
URL Rewrite module是一個(gè)native的模塊,從圖可以看到他的運(yùn)行周期是在Pre-begin Rquest和Begin Request之間,該模塊在根據(jù)請求的URL進(jìn)行規(guī)則匹配之后,最終處理新的URL以便進(jìn)入IIS pipeline的剩余周期里進(jìn)行處理,就是說處理請求的HttpHandler是根據(jù)重寫以后的新URL來決定的。
2. URL Routing
URL Routing的原理是根據(jù)現(xiàn)有的URL來定義規(guī)則,定義每個(gè)規(guī)則所對應(yīng)的HttpHandler,其本質(zhì)和URL是否友好沒有關(guān)系,只是按照統(tǒng)一的規(guī)則去調(diào)用相對應(yīng)的HttpHandler而已,找到對應(yīng)的HttpHandler,處理完以后就返回結(jié)果,找不到就暴資源錯誤。
Routing是托管代碼模塊,是在Resolve Cache周期( PostResolveRequestCache事件)里注冊,然后在MapHandler周期內(nèi)處理的。在PostResolveRequestCache事件里,該模塊查詢靜態(tài)集合routing表里的所有記錄里聲明的URL匹配規(guī)則,如果當(dāng)前URL對應(yīng)到了一個(gè)匹配的Handler,然后就使用該Handler處理結(jié)果并輸出。
兩者之間的不同
URL Rewrite是在request處理之前修改相應(yīng)的URL,URL Rewrite模塊本身不知道哪個(gè)HttpHandler處理這個(gè)請求,并且處理請求的HttpHandler也不知道自己處理的URL是原來的URL還是被重寫過的地址。
和URL Rewrite正好相反,URL Routing是根據(jù)規(guī)則為URL來指定HttpHandler的,可以看做Routing是handler的高級映射。
IIS URL Rewrite可以用于任何web程序的映射處理,包括但不限于asp.net,php,asp和靜態(tài)文件等,但Routing只能處理基于.net的web程序。
IIS URL Rewrite在IIS集成模式和經(jīng)典模式都可以用,但默認(rèn)情況下Routing只能用在集成模式下,經(jīng)典模式的話需要使用擴(kuò)展名或者通配符將程序映射到IIS上(其實(shí).net有另外一個(gè)組件aspnetfilter已經(jīng)幫我們做好了)。
IIS URL Rewrite可以根據(jù)域名,路徑,Http Header,server變量等處理重寫規(guī)則,但Routing只能按照請求的URL路徑和HTTP-Method header來處理。
IIS URL Rewrite可以執(zhí)行處理HTTP跳轉(zhuǎn),處理自定義的Status Code以及Abort請求,但Routing做不到這些。
IIS URL Rewrite的擴(kuò)展只能擴(kuò)展自己的Provider來自定義規(guī)則的存儲,但Routing的擴(kuò)展相對來說就非常強(qiáng)大了,MVC就是其中一種。
總結(jié)
兩者之間有這么多不同,那我們到底該用哪一個(gè)呢?
如果你的程序是用asp.net之外的平臺構(gòu)建的,那你只能使用IIS URL Rewrite了,否則,我們建議的規(guī)則是:
如果你在用asp.net構(gòu)建新的asp.net web程序,那就使用Routing,因?yàn)楝F(xiàn)在Routing不僅支持MVC了,也支持web form了。
如果你的asp.net web form程序已經(jīng)是現(xiàn)成的了,并且不想修改了,那就使用URL Rewrite,它可以幫你改善搜索引擎優(yōu)化。
當(dāng)然,你也可以兩者結(jié)合起來一起用,但是用之前一定要記得上面的圖里所說明的內(nèi)容:他們的執(zhí)行周期不一樣。
參考地址:http://learn.iis.net/page.aspx/496/iis-url-rewriting-and-aspnet-routing/
以上這篇ASP.NET中URL Routing和IIS上URL Rewriting的區(qū)別就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- 在ASP.NET中用MSDNURLRewriting實(shí)現(xiàn)Url Rewriting
- 在IIS7中應(yīng)用Application Request Routing配置反向代理的圖文教程
- 解讀ASP.NET 5 & MVC6系列教程(11):Routing路由
- 解讀ASP.NET 5 & MVC6系列教程(12):基于Lamda表達(dá)式的強(qiáng)類型Routing實(shí)現(xiàn)
- ASP.NET MVC3 SEO優(yōu)化:利用Routing特性提高站點(diǎn)權(quán)重