自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析ASP.NET Routing對(duì)請(qǐng)求的不同處理

開(kāi)發(fā) 后端
這里我們需要解釋的是ASP.NET Routing對(duì)請(qǐng)求的不同處理,希望本文能對(duì)大家了解ASP.NET Routing有所幫助。

在這里我們將講述ASP.NET Routing對(duì)請(qǐng)求的不同處理。文章將從處理機(jī)制方面開(kāi)始講起,然后講述監(jiān)聽(tīng)的過(guò)程。希望本文能對(duì)大家有所幫助。

ASP.NET Routing是一個(gè)通用的組件,它不涉及到任何具體的請(qǐng)求處理方式。如果您需要,也可以自己基于它進(jìn)行開(kāi)發(fā)——如FubuMvc項(xiàng)目就是這么做的。
首先,如果您需要在項(xiàng)目中使用在ASP.NET Routing的功能,則需要在web.config文件中配置一個(gè)HttpModule:

  1.       public static void RegisterRoutes(RouteCollection routes)   
  2.        {   
  3.  
  4. routes.IgnoreRoute("scripts/{*pathInfo}");   
  5. routes.IgnoreRoute("images/{*pathInfo}");   
  6. routes.MapRoute(   
  7. "Default"// Route name   
  8. "{controller}/{action}/{id}"// URL with parameters   
  9. new { controller = "Home", action = "Index", id = "" } // Parameter defaults   
  10. );   
  11. }  

線程安全的),只不過(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類型。StopRoutingHandler是個(gè)特殊的IRouteHandler對(duì)象,它的作用只是告訴UrlRouteModule,雖然某個(gè)規(guī)則匹配成功了,但是——也還是當(dāng)什么都沒(méi)發(fā)生過(guò)吧。因此,如果我們想要“跳過(guò)”一些形式的請(qǐng)求,往往則需要將“忽略”功能放在其他所有規(guī)則之前。如:

  1. public static void RegisterRoutes(RouteCollection routes)  
  2. {  
  3. routes.IgnoreRoute(" p {*pathInfo}?);< {resource}.axd name="UrlRoutingModule"> 

IgnoreRoute是定義在ASP.NET MVC中,基于RouteCollection類型的擴(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)目就是這么做的。

【編輯推薦】

  1. ASP.NET MVC單元測(cè)試:HttpContext類的Path屬性解惑
  2. 自定義的ControllerFactory:接口實(shí)現(xiàn),支持Area
  3. ASP.NET Routing之“解析URL”功能詳解
  4. 為ASP.NET MVC應(yīng)用添加自定義路由
  5. 學(xué)習(xí)ASP.NET MVC路由的使用方法
責(zé)任編輯:彭凡 來(lái)源: IT專家網(wǎng)
相關(guān)推薦

2009-08-19 09:23:40

ASP.NET Rou

2009-02-06 14:11:36

ASP.NET.NET全局異常處理

2009-07-21 15:11:14

ASP.NET Rou

2009-06-24 09:12:26

ASP.NET頁(yè)面請(qǐng)求

2011-04-13 14:57:11

ASP.NET請(qǐng)求處理

2009-07-27 10:18:12

TypeResolveASP.NET

2009-07-31 12:43:59

ASP.NET MVC

2009-08-05 15:50:13

ASP.NET優(yōu)點(diǎn)

2009-07-27 15:34:11

MembershipASP.NET

2009-07-24 13:41:15

ASP.NET AJA

2009-08-05 18:36:12

ASP.NET Che

2009-08-10 13:32:15

ASP.NET TimASP.NET組件設(shè)計(jì)

2009-07-22 18:03:00

ASP.NET ASP

2009-07-28 10:59:13

ASP.NET IIS

2009-07-20 16:23:01

ASP.NET授權(quán)模塊

2009-08-04 17:00:09

ASP.NET禁用Vi

2009-07-23 14:31:20

ASP.NET MVC

2009-07-28 16:40:11

ASP.NET異步頁(yè)面

2009-07-28 15:53:43

ASP.NET Web

2009-08-05 14:46:17

ASP.NET url
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)