IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁網(wǎng)絡(luò)編程.Net編程 → ASP.NET Routing對請求的處理方式

ASP.NET Routing對請求的處理方式

時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)

  首先,如果您需要在項目中使用在ASP.NET Routing的功能,則需要在web.config文件中配置一個HttpModule:

  其次,您應(yīng)該在Application_Start中向RouteCollection類型的RouteTable.Routes集合中添加一系列RouteBase對象,并為每個RouteBase對象指定一個獨立的名稱(大小寫無關(guān))。當(dāng)然,您也可以在運(yùn)行時動態(tài)添加或刪除內(nèi)容(RouteCollection對象是線程安全的),只不過我們平時不太會去這么做而已。值得注意的是,RouteCollections里的 RouteBase對象,它們的順序是非常重要的。

  UrlRouteModule會監(jiān)聽ASP.NET Request Pipelines的PostResolveRequestCache事件,在這個事件中UrlRouteModule會將當(dāng)前的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ī)則匹配成功了,但是——也還是當(dāng)什么都沒發(fā)生過吧。因此,如果我們想要"跳過"一些形式的請求,往往則需要將"忽略"功能放在其他所有規(guī)則之前。如:

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類型的擴(kuò)展方法。它會向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è)為當(dāng)前HttpContext對象的Handler屬性的值。于是當(dāng) ASP.NET繼續(xù)執(zhí)行下去時,便會調(diào)用這個Handler的ProcessRequest方法來處理請求了。

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

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

關(guān)鍵詞標(biāo)簽:ASP.NET

相關(guān)閱讀

文章評論
發(fā)表評論

熱門文章 誅仙3飛升任務(wù)怎么做-誅仙3飛升任務(wù)流程最新2022 誅仙3飛升任務(wù)怎么做-誅仙3飛升任務(wù)流程最新2022 鐘離圣遺物推薦-原神鐘離圣遺物詞條 鐘離圣遺物推薦-原神鐘離圣遺物詞條 解決方法:應(yīng)用程序“DEFAULT WEB SITE”中的服務(wù)器錯誤 解決方法:應(yīng)用程序“DEFAULT WEB SITE”中的服務(wù)器錯誤 使用aspnet_regiis.exe 重新注冊.NET Framework 使用aspnet_regiis.exe 重新注冊.NET Framework

相關(guān)下載

    人氣排行 誅仙3飛升任務(wù)怎么做-誅仙3飛升任務(wù)流程最新2022 asp.net表單提交方法GET\POST 在ASP.NET中如何判斷用戶IE瀏覽器的版本 Asp.net中messagebox的實現(xiàn)方法 Asp.net中的web.config配置 在ASP.NET MVC中實現(xiàn)大文件異步上傳 asp.net獲取URL和IP地址 FileUpload上傳多文件出現(xiàn)錯誤的解決方法