日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析ASP.NETRouting對請求的不同處理

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

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、成都做網(wǎng)站、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價值。

ASP.NET Routing是一個通用的組件,它不涉及到任何具體的請求處理方式。如果您需要,也可以自己基于它進行開發(fā)——如FubuMvc項目就是這么做的。
首先,如果您需要在項目中使用在ASP.NET Routing的功能,則需要在web.config文件中配置一個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. }  

線程安全的),只不過我們平時不太會去這么做而已。值得注意的是,RouteCollections里的RouteBase對象,它們的順序是非常重要的。

UrlRouteModule會監(jiān)聽ASP.NET Request Pipelines的PostResolveRequestCache事件,在這個事件中UrlRouteModule會將當前的HttpContext作為參數(shù)調(diào)用RouteTable.Routes集合的GetRouteData方法。在RouteCollection的GetRouteData方法中,又會依次將HttpContext傳入每一個RouteBase對象的GetRouteData方法,如果中途某個RouteBase對象返回了一個非null的結(jié)果,則這個結(jié)果便會直接返回給UrlRouteModule。

如果UrlRouteModule調(diào)用RouteTable.Routes.GetRouteData方法得到了null,則“一切都像沒有發(fā)生過”。如果GetRouteData方法得到了結(jié)果——一個RouteData對象,此時RouteData.Values便會包含請求中捕獲到的數(shù)據(jù)。RouteData中另一個重要的成員便是RouteData.RouteHandler屬性,它返回一個IRouteHandler對象。IRouteHandler接口中只有一個方法GetHttpHandler,它接受RequestContext作為參數(shù),并返回一個IHttpHandler對象。如ASP.NET MVC框架在利用ASP.NET Routing時,便會使用MvcRouteHandler來返回一個MvcHandler對象。

不過,UrlRouteModule在得到了IRouteHandler對象之后,并不會直接調(diào)用其GetHttpHandler方法,而是判斷它是不是ASP.NET Routing自帶的StopRoutingHandler類型。StopRoutingHandler是個特殊的IRouteHandler對象,它的作用只是告訴UrlRouteModule,雖然某個規(guī)則匹配成功了,但是——也還是當什么都沒發(fā)生過吧。因此,如果我們想要“跳過”一些形式的請求,往往則需要將“忽略”功能放在其他所有規(guī)則之前。如:

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

IgnoreRoute是定義在ASP.NET MVC中,基于RouteCollection類型的擴展方法。它會向RouteCollection中添加一個Route對象,而這個Route對象在匹配成功時返回的RouteData對象,其RouteHandler屬性便為一個StopRoutingHandler,于是余下的Routing規(guī)則也不會繼續(xù)匹配了——這一點和RouteBase對象返回null不同,因為如果返回null,則余下的規(guī)則還會依次匹配。如果返回了一個包含StopRoutingHander的RouteData,則剩下的Routing規(guī)則全部跳過。

如果UrlRouteModule得到的IRouteHandler對象不是StopRoutingHandler,則便會通過其GetHttpHandler方法獲得那個IHttpHandler對象。這個IHttpHandler對象會被放入HttpContext的Items集合中。至此,Request Pipeline的PostResolveRequestCache事件便結(jié)束了。

UrlRouteModule還會監(jiān)聽PostMapRequest事件,此時Module便會查找HttpContext.Items集合的特定位置中是否包含一個IHttpHandler對象,如果存在,則會將這個對象設(shè)為當前HttpContext對象的Handler屬性的值。于是當ASP.NET繼續(xù)執(zhí)行下去時,便會調(diào)用這個Handler的ProcessRequest方法來處理請求了。

如果這個IHttpHandler對象是MvcHttpHandler,那么它便會從RouteData中獲取一些數(shù)據(jù),構(gòu)造Controller對象,執(zhí)行Action等等。如果它是一個DynamicDataHandler,或是WebForm的HttpHandler,那么剩下的便是各自的模型的處理方式了。

因此,ASP.NET Routing是一個通用的組件,它不涉及到任何具體的請求處理方式。如果您需要,也可以自己基于它進行開發(fā)——如FubuMvc項目就是這么做的。


本文名稱:淺析ASP.NETRouting對請求的不同處理
網(wǎng)站鏈接:http://www.dlmjj.cn/article/ccohjcs.html