国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

ASP.NET Routing之“解析URL”功能詳解

開(kāi)發(fā) 后端
ASP.NET Routing中的“解析URL”功能可以把一個(gè)字符串根據(jù)指定的Pattern拆分成鍵/值對(duì)。本文介紹這個(gè)功能的簡(jiǎn)易實(shí)現(xiàn)方法。

經(jīng)常看我博客的人可能會(huì)知道,我是一個(gè)喜歡搞點(diǎn)小技巧來(lái)實(shí)現(xiàn)某個(gè)功能的人。例如博客的皮膚,自己花了不少時(shí)間定義,也是為了效果豐富一些。當(dāng)然,搞得最多的是從框架或類庫(kù)內(nèi)部取出一點(diǎn)小功能來(lái)用用,節(jié)省自己開(kāi)發(fā)的時(shí)間。這其實(shí)也是一種復(fù)用,尤其是開(kāi)發(fā)一些“擴(kuò)展”的時(shí)候,例如當(dāng)時(shí)嘗試為UpdatePanel增加上傳功能,雖然最后的結(jié)果不是很理想,但是大部分的Hack以及前后端的交互是非常成功的(最大的問(wèn)題在于跨瀏覽器實(shí)現(xiàn)iframe通信)。而現(xiàn)在也打算總結(jié)一次這方面的簡(jiǎn)單技巧,為以后的文章貢獻(xiàn)點(diǎn)引用資源。

ASP.NET Routing中解析URL功能介紹與實(shí)現(xiàn)

這次我們想“復(fù)用”的內(nèi)容是ASP.NET URL Routing中“解析URL”的功能。具體一點(diǎn)地說(shuō),就是把一個(gè)字符串根據(jù)指定的Pattern拆分成鍵/值對(duì)的功能。從.NET Reflector反編譯System.Web.Routing.dll的結(jié)果來(lái)看,這部分的解析工作是交由RouteParser和ParsedRoute兩個(gè)類完成的。這里引用一下相關(guān)的使用代碼,如果您感興趣的話,也可以閱讀它們完整的實(shí)現(xiàn):

  1. public class Route  
  2. {  
  3.     public string Url  
  4.     {  
  5.         get { ... }  
  6.         set 
  7.         {  
  8.             this._parsedRoute = RouteParser.Parse(value);  
  9.             this._url = value;  
  10.         }  
  11.     }  
  12.  
  13.     public override RouteData GetRouteData(HttpContextBase httpContext)  
  14.     {  
  15.         string virtualPath = ...  
  16.         RouteValueDictionary values = this._parsedRoute.Match(virtualPath, this.Defaults);  
  17.  
  18.         ...  
  19.     }  
  20.  
  21.     ...  
  22. }  

從代碼中可以看出,RouteParser的作用是將一個(gè)Pattern(如"{controller}/{action}/{id}")轉(zhuǎn)化成一個(gè)“解析器”,而這個(gè)解析器便是ParsedRoute類。在需要拆分一個(gè)URL字符串(如"Home/Index/5")的時(shí)候,便會(huì)調(diào)用ParsedRoute類的Match方法,由此得到一個(gè)RouteValueDictionary對(duì)象,其中包含了Pattern中定義的名稱,和一些值的映射關(guān)系。

可能您也能夠輕易實(shí)現(xiàn)這樣的功能,不過(guò)既然微軟已經(jīng)幫我們做好了,我們也不妨直接使用一下,偶爾用來(lái)拆拆字符串也是挺方便的。只可惜RouteParser和ParsedRoute都是由internal修飾的,我們無(wú)法直接訪問(wèn)到。那么就用點(diǎn)小技巧吧……說(shuō)實(shí)話,其實(shí)您會(huì)發(fā)現(xiàn)也就這么一回事,“反射”罷了。因此,我們便學(xué)著ASP.NET Routing的做法,構(gòu)建兩個(gè)類吧:

解析URL的兩個(gè)類

  1. internal static class RouteParser  
  2. {  
  3.     public static ParsedRoute Parse(string routeUrl) { ... }  
  4. }  
  5.  
  6. internal class ParsedRoute  
  7. {  
  8.     public RouteValueDictionary Match(string virtualPath, RouteValueDictionary defaultValues) { ... }  
  9. }  
  10.  

我們目前的做法算是一種Hack,為了保證其可維護(hù)性,我會(huì)選擇與目標(biāo)類庫(kù)/框架的接口盡可能完全一致的做法。這么做的好處在于,我可以很輕易地理解正在實(shí)現(xiàn)的功能,一旦出現(xiàn)了任何問(wèn)題,就可以直接去找對(duì)應(yīng)的內(nèi)部實(shí)現(xiàn),而不用在一堆堆的反射關(guān)系中“翱翔”。

接著便可以實(shí)現(xiàn)我們需要的效果了。在這里,我使用了FastReflectionLib來(lái)加快反射調(diào)用的性能。雖然我不是一個(gè)追求性能極致的Geek,但是如果有一種幾乎不耗費(fèi)額外代價(jià),就能得到數(shù)百倍的性能提升,何樂(lè)而不為呢?

  1. internal static class RouteParser  
  2. {  
  3.     private static MethodInvoker s_parseInvoker;  
  4.  
  5.     static RouteParser()  
  6.     {  
  7.         var parserType = typeof(Route).Assembly.GetType("System.Web.Routing.RouteParser");  
  8.         var parseMethod = parserType.GetMethod("Parse", BindingFlags.Static | BindingFlags.Public);  
  9.         s_parseInvoker = new MethodInvoker(parseMethod);  
  10.     }  
  11.  
  12.     public static ParsedRoute Parse(string routeUrl)  
  13.     {   
  14.         return new ParsedRoute(s_parseInvoker.Invoke(null, routeUrl));  
  15.     }  
  16. }  
  17.  
  18. internal class ParsedRoute  
  19. {  
  20.     private static MethodInvoker s_matchInvoker;  
  21.  
  22.     static ParsedRoute()  
  23.     {  
  24.         var routeType = typeof(Route).Assembly.GetType("System.Web.Routing.ParsedRoute");  
  25.         var matchMethod = routeType.GetMethod("Match", BindingFlags.Instance | BindingFlags.Public);  
  26.         s_matchInvoker = new MethodInvoker(matchMethod);  
  27.     }  
  28.  
  29.     private object m_instance;  
  30.  
  31.     public ParsedRoute(object instance)  
  32.     {  
  33.         this.m_instance = instance;  
  34.     }  
  35.  
  36.     public RouteValueDictionary Match(string virtualPath, RouteValueDictionary defaultValues)  
  37.     {  
  38.         return (RouteValueDictionary)s_matchInvoker.Invoke(this.m_instance, virtualPath, defaultValues);  
  39.     }  
  40. }  

兩個(gè)類其實(shí)都是使用反射,從類庫(kù)中獲取合適的MethodInfo,然后交給MethodInvoker去執(zhí)行。其他的……由于代碼過(guò)于簡(jiǎn)單,我都不知道還需要解釋什么東西。最后就使用xUnit測(cè)試一下吧:

解析URL效果測(cè)試

  1. public class ParseRouteTest  
  2. {  
  3.     [Fact]  
  4.     public void Basic_Parsing()  
  5.     {  
  6.         var parsedRoute = RouteParser.Parse("{controller}/{action}/{id}");  
  7.         var values = parsedRoute.Match("Home/Index/5"null);  
  8.         Assert.Equal("Home", values["controller"]);  
  9.         Assert.Equal("Index", values["action"]);  
  10.         Assert.Equal("5", values["id"]);  
  11.     }  
  12. }  

說(shuō)實(shí)話,這個(gè)方法并沒(méi)有太多技術(shù)含量,由于我們將自己的實(shí)現(xiàn)和目標(biāo)實(shí)現(xiàn)完全對(duì)應(yīng)起來(lái),所以我們所要做的,似乎也都是些機(jī)械的“映射”功能而已。這就引發(fā)了我的一個(gè)想法,既然很“機(jī)械”,那么為什么不去讓它“自動(dòng)”完成呢?例如,我們完全可以寫(xiě)一個(gè)類庫(kù),來(lái)實(shí)現(xiàn)這樣的效果:

  1. [Type("System.Web.Routing.ParsedRoute, ...")]  
  2. interface IParsedRoute  
  3. {  
  4.     RouteValueDictionary Match(string virtualPath, RouteValueDictionary defaultValues);  
  5. }  
  6.  
  7. [Type("System.Web.Routing.RouteParser, ...")]  
  8. interface IRouteParser  
  9. {  
  10.     [Static]  
  11.     IParsedRoute Parse(string url);  
  12. }  

通過(guò)定義接口和標(biāo)記,我們可以直接“聲明”需要“挖掘”出來(lái)的類型是什么。然后自然可以有框架為我們進(jìn)行匹配:

  1. IRouteParser parser = HackFactory.Create<IRouteParser>();  
  2. IParsedRoute route = parser.Parse("{controller}/{action}/{id}");  
  3. RouteValueDictionary values = route.Match("Home/Index/5"null); 

是不是一下子變得爽快了許多?簡(jiǎn)單想了想,這樣的框架從技術(shù)上來(lái)說(shuō)似乎并沒(méi)有太多困難。

以上就對(duì)ASP.NET Routing中的“解析URL”功能進(jìn)行了介紹。本文來(lái)自老趙點(diǎn)滴:《復(fù)用類庫(kù)內(nèi)部已有功能》

【編輯推薦】

  1. 為ASP.NET MVC應(yīng)用添加自定義路由
  2. 學(xué)習(xí)ASP.NET MVC路由的使用方法
  3. 淺析ASP.NET中的URL Rewrite
  4. 淺談ASP.NET MVC框架
  5. 介紹ASP.NET MVC中的MvcAjaxPanel
責(zé)任編輯:yangsai 來(lái)源: 老趙點(diǎn)滴
相關(guān)推薦

2009-10-26 15:55:43

URL Routing

2009-08-19 09:23:40

ASP.NET Rou

2009-07-21 15:11:14

ASP.NET Rou

2009-07-22 18:08:00

ASP.NET跨頁(yè)提交

2009-07-28 17:17:19

ASP.NET概述

2009-07-29 16:08:07

ASP和ASP.NET

2009-08-05 13:16:43

ASP.NET URL

2009-07-31 09:39:59

ASP.NET和URL

2009-03-12 10:42:38

RoutingIgnoreRouteASP.NET

2009-08-05 14:46:17

ASP.NET url

2014-08-26 09:22:40

ASP.NET MVCRouting

2009-07-22 16:25:41

ASP.NET AJA

2009-07-24 10:14:22

ASP.NET開(kāi)發(fā)

2009-08-05 11:14:33

ASP.NET ISA

2009-07-28 16:57:50

ASP.NET Ses

2009-07-23 13:19:51

2009-08-05 10:17:55

ASP.NET TheASP.NET開(kāi)發(fā)技巧

2009-03-09 13:46:31

RoutingWebASP.NET

2009-07-27 17:26:39

ASP.NET功能

2009-08-10 13:32:15

ASP.NET TimASP.NET組件設(shè)計(jì)
點(diǎn)贊
收藏

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

jizz日韩| 97超碰免费观看| 男女日批视频在线观看| 影音成人av| 日本va欧美va精品发布| 婷婷一区二区三区| 青青草精品视频在线| 欧美日韩18| 国精产品一区一区三区有限在线| 成人影欧美片| 国产欧美一区二区精品性色| 精品日本一区二区| 精品国产一区二区三区| 久久―日本道色综合久久| 无码人妻h动漫| 欧美乱妇一区二区三区不卡视频| 国内精品久久国产| 亚洲电影一区二区三区| 人人妻人人澡人人爽欧美一区双 | 视频在线观看91| 欧美精品久久久久久久免费观看| 电影k8一区二区三区久久| 色综合久久久久久久久久久| 亚洲国产97在线精品一区| 美女喷白浆视频| 国产日韩欧美中文| jizz欧美| 精品成人在线观看| 日本中文字幕在线播放| 精品久久久久久久久中文字幕| 91极品尤物在线播放国产| 麻豆国产欧美日韩综合精品二区 | 91九色porn在线资源| 欧美日韩国产在线观看| 色综合久久网女同蕾丝边| 亚洲一区中文在线| 成年在线播放小视频| 国产清纯美女被跳蛋高潮一区二区久久w | 精品国产伦理网| 老司机午夜在线视频| 色综合久久综合网欧美综合网| 热国产热中文视频二区| 亚洲精品久久久久久国产精华液| 亚洲天堂av线| 亚洲国产高清aⅴ视频| 精品久久久久久久无码| 日本一区二区在线不卡| 久久久久久蜜桃一区二区| 亚洲同性同志一二三专区| 亚欧黄色av| 在线视频你懂得一区二区三区| 九色在线视频蝌蚪| 欧美日韩国产大片| 99视频免费在线观看| 亚洲精品国产福利| 性欧美超级视频| 欧美日产国产成人免费图片| 特黄特色欧美大片| 国产精品久久一区主播| 午夜精品剧场| 国产精品久久999| 黄色在线一区| 日本亚洲自拍| 成人av在线一区二区三区| 国产天堂在线播放| 亚洲福利视频一区二区| 毛片在线不卡| 亚洲免费视频在线观看| 欧美片网站免费| 青青草成人在线| 亚洲精品四区| 国产青草视频在线观看| 中文字幕一区二区三| 亚洲图片123| 精品国产成人系列| 国产精品**亚洲精品| 国产精品入口尤物| 亚洲一区日本| 日韩av在线综合| 综合视频一区| 亚洲激情 国产| 嫩草一区二区三区| 中文字幕日韩一区二区三区不卡| 国产亚洲1区2区3区| 亚洲少妇诱惑| 久久久亚洲精华液精华液精华液| 欧美激情va永久在线播放| 亚洲高清资源在线观看| 91国在线高清视频| 亚洲国产精品电影| 精品久久久久久久久久久| 亚洲欧美福利一区二区| 国产精品无码永久免费888| 国产成人在线看| 好看的日韩av电影| 91ph在线| 国产成人aa精品一区在线播放| 欧美午夜免费电影| 99视频一区二区| 日韩欧美另类中文字幕| 这里只有精品在线观看| 久久久亚洲人| 国产电影一区| 久久免费看视频| 另类小说欧美激情| 国产精品欧美大片| 先锋影音亚洲资源| 久久99精品视频一区97| 色婷婷av久久久久久久| 999亚洲国产精| 影视先锋久久| 自拍一区在线观看| 性高潮久久久久久久久| 日韩欧美中文一区二区| 国产乱人伦偷精品视频不卡| 国产一区二区三区四区| p色视频免费在线观看| 宅男一区二区三区| 免费91麻豆精品国产自产在线观看| 视频在线观看国产精品| 久久精品色综合| 你懂的在线观看| 亚洲精品高清视频| 久久99热精品| 日韩一区二区三区观看| 欧美视频在线一区| 自拍偷拍欧美激情| 国内成人自拍视频| 你懂的一区二区三区| 综合伊思人在钱三区| 性xxxfreexxxx性欧美| 先锋成人影院| 日本中文字幕片| 中文视频一区视频二区视频三区| 国产欧美亚洲日本| 在线观看免费版| 一个色的综合| 97热在线精品视频在线观看| 久久视频免费在线播放| 欧美精品xxxxbbbb| 亚洲精品国产精华液| 日本道精品一区二区三区 | 99re8这里有精品热视频免费| 最新国产在线拍揄自揄视频| 手机福利在线| 一区二区不卡视频| 91亚洲人电影| 97自拍视频| 久草福利视频在线| 男女爱爱免费网站| 国产日本视频| 欧美扣逼视频| 伊人网在线视频| 免费av一区二区三区| 日韩精品在线视频免费观看| 最新国产精品久久| 国产私拍精品| 欧美日韩精品中文字幕一区二区| 搜成人激情视频| 欧美 日韩精品| 日本sm极度另类视频| 欧美日韩美女在线观看| 在线一区欧美| 久久亚洲精品人成综合网| 四虎最新网站| 国产精品乱码视频| 亚洲精品日韩久久久| 国产欧美日产一区| 黑人一区二区| 三上悠亚一区二区| 初尝黑人巨炮波多野结衣电影| 国产拍精品一二三| 欧美tk—视频vk| 国产亚洲欧美色| 亚洲视频在线免费| 男人天堂视频在线观看| 欧美三级午夜理伦三级富婆| 成人性生交大片免费观看嘿嘿视频| 日韩欧美国产电影| 亚洲欧洲av另类| 裸体素人女欧美日韩| 精品一区二区三区中文字幕视频| av福利导福航大全在线播放| 欧美xxxx黑人又粗又长精品| 超薄丝袜一区二区| 色欧美乱欧美15图片| 成人美女视频在线观看18| 色综合蜜月久久综合网| 成人国产二区| 男人的天堂av高清在线| 日韩久久一级片| 欧美午夜视频在线| 91av视频在线观看| 亚洲国产精品网站| 亚洲777理论| 91网上在线视频| 麻豆91精品| 9999国产精品| 欧美日韩黄网站| av剧情在线观看|