隨著針對IIS 7.0的URL重寫模塊的發布,以及在.NET框架3.5 SP1中包含了ASP.NET路由(Routing),許多ASP.NET開發人員開始質問這兩種特性彼此間的關系,以及應該何時使用。
Ruslan Yakushev在LearnIIS.NET上發表了一篇很有指導意義的文章。
二者本質的區別在於:IIS URL重寫的處理方式比ASP.NET路由在層次上更低,對於客戶端是不可見的。
Ruslan給出了IIS 7 URL重寫過程的可視化工作流。你可以看到URL重寫模塊是在請求被傳遞到請求處理器(Handler),例如ASP.NET管理的ASPX處理器之前被激活的。IIS URL重寫並不知道具體的請求處理器。
他同時還給出了ASP.NET路由過程的可視化工作流。可以看到ASP.NET路由就是一個請求分發器,它必須明確地獲知一個特定的請求究竟應途經哪個處理器。
來自Ruslan的描述如下:
URL重寫通常被用於在Web服務器處理請求之前操作URL路徑。URL重寫模塊並不知道處理器實際處理URL重寫的任何內容。此外,實際的請求處理器並不知道URL是否已被重寫。
ASP.NET路由通常根據請求的URL路徑將請求分發到處理器。與URL重寫相反,路由組件知道處理器,並能夠選擇可以為請求的URL生成反應的處理器。你可以將ASP.NET路由看作是一個高級的處理器映射機制。
IIS URL重寫模塊能夠用於任何類型的Web應用程序,包括ASP.NET,PHP,ASP和靜態文件。ASP.NET路由只能用於基於.NET框架的Web應用程序。
在用於應用程序池方面,不管是集成的還是經典的IIS管道模式,IIS URL重寫模塊的工作方式都是相同的。而ASP.NET路由則會優先選擇使用集成管道模式。ASP.NET路由也可以工作於經典模式,但是在這種情況下,應用程序的URL必須包含文件擴展名,或者應用程序必須在IIS中使用“*”配置處理器。
URL重寫模塊可以根據域名、HTTP標頭和服務器變量進行重寫判斷。默認情況下,ASP.NET路由只能使用URL路徑以及標頭的形式。
除了重寫功能,URL重寫模塊能夠執行HTTP重定向,確定自定義狀態碼以及取消請求。ASP.NET路由則不具有這些功能。
URL重寫模塊在當前版本中是不能擴展的。ASP.NET路由完全能夠擴展和定制。