Asp.Net路由系統(tǒng)的實現(xiàn)原理是什么?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
我們一直強調(diào)網(wǎng)站制作、做網(wǎng)站對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)的建站公司不一定是大公司,成都創(chuàng)新互聯(lián)公司作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。創(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默認值 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"> <h2>這是Default.aspx頁面</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/
原因是因為注冊路由的時候,為路由模板中的變量設(shè)置了默認值,所以當用以上三種url時是等效的。
回頭看Global文件中,在注冊路由時還設(shè)置了一個變量:
這是使用正則規(guī)則限定了路由模板中變量的值,請求url中對應(yīng)的變量值只有與正則匹配才能正確請求,否則返回404錯誤。如id值長度大于3時:
上面通過一個簡單的例子體驗了一下Asp.Net路由系統(tǒng),下面我們通過翻看源碼來剖析一下Asp.Net路由系統(tǒng)的實現(xiàn)原理。
首先,我們Global文件中使用以下語句注冊一個路由時,實際上是向全局路由表添加一個路由。
通過Reflector工具,我們可以看到:
現(xiàn)在有個問題,在注冊好路由之后,Asp.Net是如何使用路由系統(tǒng)的呢?實際上,Asp.Net路由系統(tǒng)是通過注冊一個HttpModule對象,由這個HttpModule對象實現(xiàn)針對請求進行攔截,然后動態(tài)映射到用于處理當前請求的HttpHandler對象中,最后通過HttpHandler對象對請求進行處理并響應(yīng)。這個HttpModule實際上就是UrlRoutingModule,我們在啟動Asp.Net程序時,通過Global文件中的Modules屬性可以驗證,從下面截圖可以看到,Modules屬性中包含了已經(jīng)注冊的HttpModule,其中就包含UrlRoutingModule:
在這個UrlRoutingModule里面,又進行了哪些跟路由相關(guān)的操作呢,我們還是繼續(xù)翻看源碼:
通過上面的源碼查看,我們可以看出,當有請求來到時,Asp.Net通過注冊的UrlRoutingModule模塊攔截了請求,然后從全局路由表中查找匹配的RouteData,如果找得到,根據(jù)HttpApplication獲取到對應(yīng)的HttpHandler,然后將其映射到當前請求上下文中,供后續(xù)的管道事件用以處理當前請求。
下面我們繼續(xù)翻看源碼,剖析一下UrlRoutingModule是怎么從全局路由表中獲取RouteData的:
從上面可以看到,UrlRoutingModule中調(diào)用全局路由表的GetRouteData,實際上是依次調(diào)用注冊的每個Route的GetRouteData,返回第一個匹配的RouteData,如果注冊的路由都不匹配,返回null。
下面我們再來看看Route里面的GetRouteData做了些什么:
Match方法:
通過依次調(diào)用Route的GetRouteData方法,在GetRouteData方法中做了如下操作:
1、調(diào)用了ParsedRoute類型的Match方法進行請求Url和注冊在當前Route對象中的路由模板的匹配工作,如果沒有匹配,直接返回null;
2、如果請求Url和當前Route對象的路由模板匹配了,常見RouteData對象;
3、根據(jù)注冊路由信息時定義的約束條件來檢驗當前請求Url是否通過,不通過返回null;
4、為RouteData對象的Values和DataTokens賦值操作;
5、返回RouteData對象;
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。
網(wǎng)頁標題:Asp.Net路由系統(tǒng)的實現(xiàn)原理是什么-創(chuàng)新互聯(lián)
標題來源:http://vcdvsql.cn/article28/iisjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、云服務(wù)器、域名注冊、微信公眾號、企業(yè)建站、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)