解析ASP.NET Routing對請求的處理方式_.Net教程
推薦:揭秘.Net中的委托我本來以為委托很簡單,本來只想簡簡單單的說說委托背后的東西,委托的使用方法。原本只想解釋一下那句:委托是面向對象的、類型安全的函數指針。可沒想到最后惹出一堆的事情來,越惹越多,罪過,罪過。本文后面一部分是我在一邊用SOS探索一邊記錄的,寫的非
首先,如果您需要在項目中使用在ASP.NET Routing的功能,則需要在web.config文件中配置一個HttpModule:
以下為引用的內容: <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, ..." /> |
其次,您應該在Application_Start中向RouteCollection類型的RouteTable.Routes集合中添加一系列RouteBase對象,并為每個RouteBase對象指定一個獨立的名稱(大小寫無關)。當然,您也可以在運行時動態添加或刪除內容(RouteCollection對象是線程安全的),只不過我們平時不太會去這么做而已。值得注意的是,RouteCollections里的RouteBase對象,它們的順序是非常重要的。
UrlRouteModule會監聽ASP.NET Request Pipelines的PostResolveRequestCache事件,在這個事件中UrlRouteModule會將當前的HttpContext作為參數調用RouteTable.Routes集合的GetRouteData方法。在RouteCollection的GetRouteData方法中,又會依次將HttpContext傳入每一個RouteBase對象的GetRouteData方法,如果中途某個RouteBase對象返回了一個非null的結果,則這個結果便會直接返回給UrlRouteModule。
如果UrlRouteModule調用RouteTable.Routes.GetRouteData方法得到了null,則“一切都像沒有發生過”。如果GetRouteData方法得到了結果——一個RouteData對象,此時RouteData.Values便會包含請求中捕獲到的數據。RouteData中另一個重要的成員便是RouteData.RouteHandler屬性,它返回一個IRouteHandler對象。IRouteHandler接口中只有一個方法GetHttpHandler,它接受RequestContext作為參數,并返回一個IHttpHandler對象。如ASP.NET MVC框架在利用ASP.NET Routing時,便會使用MvcRouteHandler來返回一個MvcHandler對象。
不過,UrlRouteModule在得到了IRouteHandler對象之后,并不會直接調用其GetHttpHandler方法,而是判斷它是不是ASP.NET Routing自帶的StopRoutingHandler類型。StopRoutingHandler是個特殊的IRouteHandler對象,它的作用只是告訴UrlRouteModule,雖然某個規則匹配成功了,但是——也還是當什么都沒發生過吧。因此,如果我們想要“跳過”一些形式的請求,往往則需要將“忽略”功能放在其他所有規則之前。如:
以下為引用的內容: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("scripts/{*pathInfo}"); routes.IgnoreRoute("images/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); } |
IgnoreRoute是定義在ASP.NET MVC中,基于RouteCollection類型的擴展方法。它會向RouteCollection中添加一個Route對象,而這個Route對象在匹配成功時返回的RouteData對象,其RouteHandler屬性便為一個StopRoutingHandler,于是余下的Routing規則也不會繼續匹配了——這一點和RouteBase對象返回null不同,因為如果返回null,則余下的規則還會依次匹配。如果返回了一個包含StopRoutingHander的RouteData,則剩下的Routing規則全部跳過。
如果UrlRouteModule得到的IRouteHandler對象不是StopRoutingHandler,則便會通過其GetHttpHandler方法獲得那個IHttpHandler對象。這個IHttpHandler對象會被放入HttpContext的Items集合中。至此,Request Pipeline的PostResolveRequestCache事件便結束了。
UrlRouteModule還會監聽PostMapRequest事件,此時Module便會查找HttpContext.Items集合的特定位置中是否包含一個IHttpHandler對象,如果存在,則會將這個對象設為當前HttpContext對象的Handler屬性的值。于是當ASP.NET繼續執行下去時,便會調用這個Handler的ProcessRequest方法來處理請求了。
如果這個IHttpHandler對象是MvcHttpHandler,那么它便會從RouteData中獲取一些數據,構造Controller對象,執行Action等等。如果它是一個DynamicDataHandler,或是WebForm的HttpHandler,那么剩下的便是各自的模型的處理方式了。
因此,ASP.NET Routing是一個通用的組件,它不涉及到任何具體的請求處理方式。如果您需要,也可以自己基于它進行開發——如FubuMvc項目就是這么做的。
分享:如何用Microsoft Ajax Minifier幫Javascript瘦身摘要 前兩天在Plurk上看到91哥在談這個工具,一時興起之下就稍為玩了一下,發現還蠻有趣的,以下介紹給大家參考看看。 從Web 2.0興起后,使用者對于網頁互動的需求愈來愈大,不僅要求使用界面美觀,也希望操作功能的友善度上能與過去的Winform程式看齊,而為
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-解析ASP.NET Routing對請求的處理方式。