<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        剖析Asp.Net路由系統實現原理

        來源:懂視網 責編:小采 時間:2020-11-27 22:35:56
        文檔

        剖析Asp.Net路由系統實現原理

        剖析Asp.Net路由系統實現原理:對于Asp.Net Web Forms應用來說,請求的Url都是對應一個具體的物理文件(http://xxx.com/default.aspx)。這樣的Url與具體物理文件緊密綁定在一起,帶來了諸多方便的局限:可讀性、SEO優化等。為了解決這些局限性,微軟引入了URL路由系統。下面通過一個De
        推薦度:
        導讀剖析Asp.Net路由系統實現原理:對于Asp.Net Web Forms應用來說,請求的Url都是對應一個具體的物理文件(http://xxx.com/default.aspx)。這樣的Url與具體物理文件緊密綁定在一起,帶來了諸多方便的局限:可讀性、SEO優化等。為了解決這些局限性,微軟引入了URL路由系統。下面通過一個De

        對于Asp.Net Web Forms應用來說,請求的Url都是對應一個具體的物理文件(http://xxx.com/default.aspx)。這樣的Url與具體物理文件緊密綁定在一起,帶來了諸多方便的局限:可讀性、SEO優化等。為了解決這些局限性,微軟引入了URL路由系統。下面通過一個Demo來剖析一下Asp.Net的路由系統。

        創建一個空的WebForm應用程序,在Global.asax.cs文件中加入如下代碼:

        public class Global : System.Web.HttpApplication
         {
         protected void Application_Start(object sender, EventArgs e)
         {
         //處理匹配的文件
         RouteTable.Routes.RouteExistingFiles = true;
         //url默認值
         RouteValueDictionary defaults = new RouteValueDictionary() { { "name", "wuwenmao" }, { "id", "001" } };
         //路由約束
         RouteValueDictionary constraints = new RouteValueDictionary() { { "name", @"\w{2,10}" }, { "id", @"\d{3}" } };
         //與路由相關的值,但不參與路由是否匹配URL模式
         RouteValueDictionary dataTokens = new RouteValueDictionary() { { "defaultName", "wuwenmao" }, { "defaultId", "001" } };
         RouteTable.Routes.MapPageRoute("default", "employees/{name}/{id}", "~/Default.aspx", false, defaults, constraints, dataTokens);
         }
         }

        新建名為Default的WebForm頁面,頁面代碼如下:

        <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication2.Default" %>
        
        <!DOCTYPE html>
        
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
         <title></title>
        </head>
        <body>
         <form id="form1" runat="server">
         <h1>這是Default.aspx頁面</h1>
         <div>
         
         RouteData中Values:
         <ul>
         <% foreach (var value in RouteData.Values)
         { %>
         <li>
         <%=value.Key %>=<%=value.Value %>
         </li>
         <%} %>
         </ul>
         RouteData中DataTokens:
         <ul>
         <% foreach (var value in RouteData.DataTokens)
         { %>
         <li>
         <%=value.Key %>=<%=value.Value %>
         </li>
         <%} %>
         </ul>
         </div>
         </form>
        </body>
        </html>
        

        輸入路徑為一下三種,得到的結果都是一樣的:

        http://localhost:2947/employees/wuwenmao/001

        http://localhost:2947/employees/wuwenmao

        http://localhost:2947/employees/

        原因是因為注冊路由的時候,為路由模板中的變量設置了默認值,所以當用以上三種url時是等效的。

        回頭看Global文件中,在注冊路由時還設置了一個變量:

        這是使用正則規則限定了路由模板中變量的值,請求url中對應的變量值只有與正則匹配才能正確請求,否則返回404錯誤。如id值長度大于3時:

         

        上面通過一個簡單的例子體驗了一下Asp.Net路由系統,下面我們通過翻看源碼來剖析一下Asp.Net路由系統的實現原理。

        首先,我們Global文件中使用以下語句注冊一個路由時,實際上是向全局路由表添加一個路由。

        通過Reflector工具,我們可以看到:

         

              現在有個問題,在注冊好路由之后,Asp.Net是如何使用路由系統的呢?實際上,Asp.Net路由系統是通過注冊一個HttpModule對象,由這個HttpModule對象實現針對請求進行攔截,然后動態映射到用于處理當前請求的HttpHandler對象中,最后通過HttpHandler對象對請求進行處理并響應。這個HttpModule實際上就是UrlRoutingModule,我們在啟動Asp.Net程序時,通過Global文件中的Modules屬性可以驗證,從下面截圖可以看到,Modules屬性中包含了已經注冊的HttpModule,其中就包含UrlRoutingModule:

         

        在這個UrlRoutingModule里面,又進行了哪些跟路由相關的操作呢,我們還是繼續翻看源碼:

         

        通過上面的源碼查看,我們可以看出,當有請求來到時,Asp.Net通過注冊的UrlRoutingModule模塊攔截了請求,然后從全局路由表中查找匹配的RouteData,如果找得到,根據HttpApplication獲取到對應的HttpHandler,然后將其映射到當前請求上下文中,供后續的管道事件用以處理當前請求。

        下面我們繼續翻看源碼,剖析一下UrlRoutingModule是怎么從全局路由表中獲取RouteData的:

         

        從上面可以看到,UrlRoutingModule中調用全局路由表的GetRouteData,實際上是依次調用注冊的每個Route的GetRouteData,返回第一個匹配的RouteData,如果注冊的路由都不匹配,返回null。

        下面我們再來看看Route里面的GetRouteData做了些什么:

         

        Match方法:

        通過依次調用Route的GetRouteData方法,在GetRouteData方法中做了如下操作:

        1、調用了ParsedRoute類型的Match方法進行請求Url和注冊在當前Route對象中的路由模板的匹配工作,如果沒有匹配,直接返回null;

        2、如果請求Url和當前Route對象的路由模板匹配了,常見RouteData對象;

        3、根據注冊路由信息時定義的約束條件來檢驗當前請求Url是否通過,不通過返回null;

        4、為RouteData對象的Values和DataTokens賦值操作;

        5、返回RouteData對象;

        到此,Asp.Net的路由系統基本上剖析完畢,還有很多細節限于篇幅沒辦法一一剖析。

        總結:

        通過以上的剖析,我們整理一下思路,對Asp.Net路由系統所做的工作做個總結:首先,我們在Global中注冊了Route對象,然后通過在Asp.Net注冊的HttpModule模塊UrlRoutingModule進行攔截請求Url,之后從全局路由表RouteTables.Routes中依次調用Route對象的GetRouteData進行請求Url和注冊路由信息的匹配,返回第一個匹配的RouteData,查找完整個RouteTables.Routes后沒有匹配到,返回null,最終會返回404給前端頁面。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        剖析Asp.Net路由系統實現原理

        剖析Asp.Net路由系統實現原理:對于Asp.Net Web Forms應用來說,請求的Url都是對應一個具體的物理文件(http://xxx.com/default.aspx)。這樣的Url與具體物理文件緊密綁定在一起,帶來了諸多方便的局限:可讀性、SEO優化等。為了解決這些局限性,微軟引入了URL路由系統。下面通過一個De
        推薦度:
        標簽: 原理 路由 剖析
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲精品自产拍在线观看| 亚洲最大AV网站在线观看| 99爱视频99爱在线观看免费| 美女内射无套日韩免费播放| 亚洲人成影院在线无码按摩店| 亚洲熟女综合一区二区三区| 精品韩国亚洲av无码不卡区| 久久久久久久国产免费看| 四虎在线最新永久免费| 国产极品美女高潮抽搐免费网站| 亚洲一区二区三区免费| 亚洲一区在线视频| 国产AV日韩A∨亚洲AV电影| 日韩免费视频一区二区| 国产大片51精品免费观看| 婷婷亚洲综合五月天小说在线 | 无人视频免费观看免费视频| 免费观看男人吊女人视频| 成年性生交大片免费看| 亚洲精品国产精品乱码在线观看| 中文字幕一区二区免费| 青青青青青青久久久免费观看 | 亚洲精品无码AV中文字幕电影网站| 亚洲视频在线观看地址| 亚洲欧美国产国产一区二区三区| 日本一区二区免费看| 中文字幕亚洲色图| 四虎成人免费网址在线| 国产成人亚洲精品| 成年人免费的视频| 久久久亚洲欧洲日产国码农村| 男女猛烈xx00免费视频试看| 亚洲区小说区激情区图片区| 国内精品免费麻豆网站91麻豆 | 最近中文字幕电影大全免费版| 亚洲国产精品一区二区第一页| a级毛片免费高清视频| 国产成人免费永久播放视频平台| A级毛片成人网站免费看| 亚洲中文无码线在线观看| 99热在线免费播放|