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