国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

剖析Asp.Net路由系統(tǒng)實(shí)現(xiàn)原理

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:35:56
文檔

剖析Asp.Net路由系統(tǒng)實(shí)現(xiàn)原理

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

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

創(chuàng)建一個空的WebForm應(yīng)用程序,在Global.asax.cs文件中加入如下代碼:

public class Global : System.Web.HttpApplication
 {
 protected void Application_Start(object sender, EventArgs e)
 {
 //處理匹配的文件
 RouteTable.Routes.RouteExistingFiles = true;
 //url默認(rèn)值
 RouteValueDictionary defaults = new RouteValueDictionary() { { "name", "wuwenmao" }, { "id", "001" } };
 //路由約束
 RouteValueDictionary constraints = new RouteValueDictionary() { { "name", @"\w{2,10}" }, { "id", @"\d{3}" } };
 //與路由相關(guān)的值,但不參與路由是否匹配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>

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

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

http://localhost:2947/employees/wuwenmao

http://localhost:2947/employees/

原因是因?yàn)樽月酚傻臅r候,為路由模板中的變量設(shè)置了默認(rèn)值,所以當(dāng)用以上三種url時是等效的。

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

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

 

上面通過一個簡單的例子體驗(yàn)了一下Asp.Net路由系統(tǒng),下面我們通過翻看源碼來剖析一下Asp.Net路由系統(tǒng)的實(shí)現(xiàn)原理。

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

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

 

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

 

在這個UrlRoutingModule里面,又進(jìn)行了哪些跟路由相關(guān)的操作呢,我們還是繼續(xù)翻看源碼:

 

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

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

 

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

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

 

Match方法:

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

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

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

3、根據(jù)注冊路由信息時定義的約束條件來檢驗(yàn)當(dāng)前請求Url是否通過,不通過返回null;

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

5、返回RouteData對象;

到此,Asp.Net的路由系統(tǒng)基本上剖析完畢,還有很多細(xì)節(jié)限于篇幅沒辦法一一剖析。

總結(jié):

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

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

文檔

剖析Asp.Net路由系統(tǒng)實(shí)現(xiàn)原理

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

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 91大神在线观看精品一区 | 中文国产成人精品久久app | 欧美在线看欧美视频免费网站 | 九九精品视频一区在线 | 国产成人精品久久亚洲高清不卡 | 国内精品自产拍在线观看91 | 欧美第一网站 | 九九久久久2| 欧美综合亚洲图片综合区 | 国产香蕉视频在线 | 欧美日本中文字幕 | a国产在线| 99久久精品国产综合一区 | 亚洲一区色图 | 欧美日韩精品一区二区三区 | 亚欧日韩 | 91精品国产9l久久久久 | 高清在线一区二区 | 在线欧美色图 | 美女一丝不佳一级毛片大屁股 | 国产美女视频黄a视频全免费网站 | 亚洲 欧美 中文字幕 | 亚洲综合欧美日韩 | 日韩在线欧美 | 亚洲一区二区三区高清 | 国产成人亚洲综合91精品555 | 国产a视频 | 99久久精品国产综合一区 | 性欧美大战久久久久久久野外 | 亚洲一区二区三区精品视频 | 日本伊人久久 | 亚洲黄色一区二区 | 国内精品99 | 高清 国产 日韩 欧美 | www.香蕉视频在线观看 | 在线免费观看国产视频 | 最新国产精品亚洲 | 久久久网久久久久合久久久久 | 影音先锋亚洲资源 | 亚洲精品福利 | 日韩欧美亚洲一区 |