Asp.Net路由系統(tǒng)的實(shí)現(xiàn)原理是什么?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)建一個(gè)空的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頁(yè)面,頁(yè)面代碼如下:
<%@ 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">
<h2>這是Default.aspx頁(yè)面</h2>
<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)樽?cè)路由的時(shí)候,為路由模板中的變量設(shè)置了默認(rèn)值,所以當(dāng)用以上三種url時(shí)是等效的。
回頭看Global文件中,在注冊(cè)路由時(shí)還設(shè)置了一個(gè)變量:

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

上面通過(guò)一個(gè)簡(jiǎn)單的例子體驗(yàn)了一下Asp.Net路由系統(tǒng),下面我們通過(guò)翻看源碼來(lái)剖析一下Asp.Net路由系統(tǒng)的實(shí)現(xiàn)原理。
首先,我們Global文件中使用以下語(yǔ)句注冊(cè)一個(gè)路由時(shí),實(shí)際上是向全局路由表添加一個(gè)路由。

通過(guò)Reflector工具,我們可以看到:

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

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



通過(guò)上面的源碼查看,我們可以看出,當(dāng)有請(qǐng)求來(lái)到時(shí),Asp.Net通過(guò)注冊(cè)的UrlRoutingModule模塊攔截了請(qǐng)求,然后從全局路由表中查找匹配的RouteData,如果找得到,根據(jù)HttpApplication獲取到對(duì)應(yīng)的HttpHandler,然后將其映射到當(dāng)前請(qǐng)求上下文中,供后續(xù)的管道事件用以處理當(dāng)前請(qǐng)求。
下面我們繼續(xù)翻看源碼,剖析一下UrlRoutingModule是怎么從全局路由表中獲取RouteData的:

從上面可以看到,UrlRoutingModule中調(diào)用全局路由表的GetRouteData,實(shí)際上是依次調(diào)用注冊(cè)的每個(gè)Route的GetRouteData,返回第一個(gè)匹配的RouteData,如果注冊(cè)的路由都不匹配,返回null。
下面我們?cè)賮?lái)看看Route里面的GetRouteData做了些什么:

Match方法:


通過(guò)依次調(diào)用Route的GetRouteData方法,在GetRouteData方法中做了如下操作:
1、調(diào)用了ParsedRoute類型的Match方法進(jìn)行請(qǐng)求Url和注冊(cè)在當(dāng)前Route對(duì)象中的路由模板的匹配工作,如果沒(méi)有匹配,直接返回null;
2、如果請(qǐng)求Url和當(dāng)前Route對(duì)象的路由模板匹配了,常見(jiàn)RouteData對(duì)象;
3、根據(jù)注冊(cè)路由信息時(shí)定義的約束條件來(lái)檢驗(yàn)當(dāng)前請(qǐng)求Url是否通過(guò),不通過(guò)返回null;
4、為RouteData對(duì)象的Values和DataTokens賦值操作;
5、返回RouteData對(duì)象;
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。
網(wǎng)頁(yè)標(biāo)題:Asp.Net路由系統(tǒng)的實(shí)現(xiàn)原理是什么-創(chuàng)新互聯(lián)
標(biāo)題來(lái)源:http://www.chinadenli.net/article28/iisjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷(xiāo)推廣、云服務(wù)器、域名注冊(cè)、微信公眾號(hào)、企業(yè)建站、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)