asp.net 2.0中的url映射
最後更新:2017-02-28
來源:互聯網
上載者:User
asp.net 介紹
url映射是asp.net 2.0的一個新的特性,它可以讓開發人員把一個頁映射到另一個url上。如果一個url請求過來,程式會自動把它重新對應到服務端。例如,如果你在程式中配置了把~/Beverages.aspx映射到了~/ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages,那麼當使用者在瀏覽器中輸入了http://YourSite.com/Beverages.aspx,伺服器會接收後會自動的轉到http://YourSite.com/ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages去處理。而這個使用者在瀏覽器的地址欄中看到的仍然是http://YourSite.com/Beverages.aspx。他們不會知道這個請求被重新對應了。
url映射經常是為了提供友好的url而被使用,這種友好的url更易讀,更容易理解。例如Beverages.aspx要比ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages更容易懂。當你修改網站結構的時候,url映射也是非常有用的。想象一下,所有的產品資訊都需要用http://YourSite.com/Products/...來訪問,如果你想修改這個結構,通過http://YourSite.com/Catalog/...來代替它的話,如果一位你的老使用者通過收藏夾來訪問的話,就會得到一個404的錯誤,而如果使用url映射,則兩個url寫法都能夠訪問到產品資訊。
本文我們將研究如何設定asp.net 2.0 web應用程式提供的url映射功能,也來看一看url映射是如何工作的。我們也將論述一下asp.net 1.x中的url映射實現的技術,以及擴充asp.net 2.0中的url映射。接下來你將看到更多。
定義url映射
在asp.net 2.0中使用url映射是非常簡單的,我們可以直接在web.config中設定。通過一些簡單的配置,我們就可以在一些情境中建立url映射的功能,但是它不適用一些複雜的情境,如需要動態定義映射或者需要更強適應性的時候。本文稍後會提供一個簡單的例子。
為了指定一個映射,我們可以在web.config裡增加一個<urlMappings>元素,並設定它的enabled屬性為true,然後再每一個<add>元素中做映射。在<add>元素中,分別指明url(引入的url)和mappedUrl(要映射到的url)屬性。
在本文結尾處將提供樣本下載,它是一個asp.net 2.0的web應用程式,使用了Northwind資料庫來顯示產品資訊。ProductsByCategory.aspx頁需要兩個參數,分別是CategoryID和CategoryName。然後這個頁用一個Label控制項來顯示CategoryName,用一個GridView控制項,和一個SqlDataSource控制項來顯示CategoryID所指向的產品的列表。所以,使用者使用地址~/ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages來訪問這個頁面。
我們可以使用asp.net 2.0的url映射功能,來給使用者提供一個友好的url,像~/Beverages.aspx這樣的。我們在<urlMappings>元素中寫8個映射,來為Northwind資料庫中的每一個產品類建立一個友好的url。寫完這些映射後,如果用想看飲料類的產品就可以通過地址~/ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages或~/Beverages.aspx來訪問了。
<configuration>
<system.web>
<urlMappings enabled="true">
<add
url="~/Beverages.aspx"
mappedUrl="~/ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages" />
<add
url="~/Condiments.aspx"
mappedUrl="~/ProductsByCategory.aspx?CategoryID=2&CategoryName=Condiments" />
<add
url="~/Confections.aspx"
mappedUrl="~/ProductsByCategory.aspx?CategoryID=3&CategoryName=Confections" />
<add
url="~/Dairy.aspx"
mappedUrl="~/ProductsByCategory.aspx?CategoryID=4&CategoryName=Dairy+Products" />
<add
url="~/Grains.aspx"
mappedUrl="~/ProductsByCategory.aspx?CategoryID=5&CategoryName=Grains+and+Cereals" />
<add
url="~/Meat.aspx"
mappedUrl="~/ProductsByCategory.aspx?CategoryID=6&CategoryName=Meat+and+Poultry" />
<add
url="~/Produce.aspx"
mappedUrl="~/ProductsByCategory.aspx?CategoryID=7&CategoryName=Produce" />
<add
url="~/Seafood.aspx"
mappedUrl="~/ProductsByCategory.aspx?CategoryID=8&CategoryName=Seafood" />
</urlMappings>
</system.web>
</configuration>
注意:因為web.config是xml格式的,所以所有xml的特徵都將被保留。例如,如果你想輸入符號&,就要寫成&。
當這個頁是通過友好url(Beverages.aspx)被訪問的時候,則將用到對應檔中的參數。通過下面的截圖我們可以注意到,使用者在瀏覽器的地址欄輸入了Beverages.aspx,但這個請求發到服務端後,會自動對應到~/ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages,而使用者在地址欄中看到的卻仍然是Beverages.aspx。但是透過服務端代碼,參數CategoryID和CategoryName將用來在呈現類別名和類別下產品列表時被使用。
asp.net 2.0是如何映射url的
當一個請求到達了web伺服器,asp.net runtime會決定請求哪個url,然後調用頁的相應的類呈現出結果。每個頁都有它自己的生命週期,包括控制項的初始化和處理,通過一些階段,如PreInit,Init,Load等之後將處理結果在標記中呈現,再把這些標記傳給瀏覽器中顯示。
在這些步驟發生之前,首先會檢查請求的url,並且查看所請求的url是否在url對應檔按中出現。如果有,則使用HttpContext類的RewritePath方法,該方法將通過web.config中指定的規則更細當前請求的url。這些資訊更新後,系統將把使用者最初輸入的url用映射後的url代替。但是使用者在瀏覽器的地址欄看到的仍然是最初輸入的url。
其工作流程圖示如下:
asp.net 2.0中的url映射的缺點。
asp.net 2.0中的url映射主要有兩個缺點。首先,所有url映射必須靜態在web.config中定義。這使得一些資料驅動的web網站如果要使用url映射就要手工往設定檔裡輸入所有相關資訊,只是不現實的。本文結束後有個例子,你會發現如果你從資料庫中刪除了某一類別或新增了某一類別,你就必須手動修改web.config檔案,在<urlMappings>節點處刪除或增加一個<add>元素。
另一個缺點是無法使用Regex。在有大量的url需要映射的時候,有一種情況是通過定義一種映射模式來實現所有url的映射,這種特別的需求在一些網站的重構中是非常有用的。如果在重寫規則中可以用Regex,那麼一句非常簡單的映射就可以完成所有老檔案夾映射到新檔案夾上的功能。(假設一個web網站要把“Old”檔案夾重新命名為“New”)
<add url="~/Old/(.*)" mappedUrl="~/New/$1" />
在asp.net 2.0不能在url映射的實現過程中提供Regex功能的這段期間,Chris Pietschmann提供了一段HTTP Module代碼來做這件事,在他的Blog中有詳細說明“asp.net 2.0:給url映射提供Regex功能”這段HTTP Module也可以動態寫映射規則。
另一方面,還有一個小缺點,就是當使用者通過url映射訪問頁面後,如果<form>提交了,將會轉到真實頁。就是說,如果使用者通過友好url Beverages.aspx 來訪問ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages頁面的話,如果頁面回傳資料了,那麼瀏覽器將會去請求ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages而不是Beverages.aspx。功能還能正常的實現,但是地址欄上的地址變化了,這會把通過記下url地址訪問頁面的使用者弄糊塗。
asp.net 1.x中的url映射
asp.net 1.x中沒有提供類似asp.net 2.0中的<urlMappings>元素,但是通過自訂的HTTP Handler或Module也可以實現映射的功能。詳細的實現過程請看我的另一篇文章“asp.net中的url重寫”。這篇文章是為了asp.net 1.x寫的,但其中的想法也適用於asp.net 2.0。Chris Pietschmann為asp.net 2.0寫的給url映射提供Regex功能的HTTP Module也使用了相同的想法。
“asp.net中的url重寫”這篇文章使用了form提交後重新對應為友好url的技術。
結論
本文中,我們一起看了一下asp.net 2.0中url映射的特性,它提供了一個非常簡單的方法來實現url映射。這個技術通常為了建立友好url和處理網站重構時使用。不幸的是,我們需要手動建立url映射項,如果需要動態建立url映射的話,我們可以通過自訂HTTP Module來實現。