最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年02月15日 11:22:09   作者:~!泛泛而談~  
本篇文章主要介紹了剖析Asp.Net路由系統(tǒng)實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

對于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默認值
      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/

原因是因為注冊路由的時候,為路由模板中的變量設(shè)置了默認值,所以當(dāng)用以上三種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)映射到用于處理當(dāng)前請求的HttpHandler對象中,最后通過HttpHandler對象對請求進行處理并響應(yīng)。這個HttpModule實際上就是UrlRoutingModule,我們在啟動Asp.Net程序時,通過Global文件中的Modules屬性可以驗證,從下面截圖可以看到,Modules屬性中包含了已經(jīng)注冊的HttpModule,其中就包含UrlRoutingModule:

 

在這個UrlRoutingModule里面,又進行了哪些跟路由相關(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,實際上是依次調(diào)用注冊的每個Route的GetRouteData,返回第一個匹配的RouteData,如果注冊的路由都不匹配,返回null。

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

 

Match方法:

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

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

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

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

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

5、返回RouteData對象;

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

總結(jié):

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • ASP.NET Core實現(xiàn)AES-GCM加密算法

    ASP.NET Core實現(xiàn)AES-GCM加密算法

    這篇文章介紹了ASP.NET Core實現(xiàn)AES-GCM加密的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 解決uploadify使用時session發(fā)生丟失問題的方法

    解決uploadify使用時session發(fā)生丟失問題的方法

    這篇文章主要為大家詳細介紹了uploadify使用時發(fā)現(xiàn)session發(fā)生丟失問題的解決方法,遇到過類似問題的朋友可以參考本文進行解決
    2016-05-05
  • .Net Core使用Socket與樹莓派進行通信詳解

    .Net Core使用Socket與樹莓派進行通信詳解

    這篇文章主要為大家詳細介紹了.Net Core使用Socket與樹莓派進行通信,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • asp.net 編程 實用語句(6條)

    asp.net 編程 實用語句(6條)

    asp.net編程中6條實用語句,希望可以對asp.net編程的朋友有所幫助。
    2009-06-06
  • Visual Studio 2019 使用 Live Share的教程圖解

    Visual Studio 2019 使用 Live Share的教程圖解

    Visual Studio 2019 在今天發(fā)布(北京時間)了,這次帶來了一個比較有趣的 Live Share 功能,使用它可以進行更好的協(xié)作開發(fā)。這篇文章主要介紹了Visual Studio 2019 使用 Live Share的教程,需要的朋友可以參考下
    2019-04-04
  • asp.net GridView模板列中實現(xiàn)選擇行功能

    asp.net GridView模板列中實現(xiàn)選擇行功能

    近來在項目中用到了GridView控件,用它實現(xiàn)添加、修改、刪除、選擇、顯示復(fù)雜表頭等功能
    2010-07-07
  • ASP.NET Eval進行數(shù)據(jù)綁定的方法

    ASP.NET Eval進行數(shù)據(jù)綁定的方法

    ASP.NET Eval在數(shù)據(jù)綁定方面的應(yīng)用是眾所周知的,不過技術(shù)在發(fā)展,當(dāng)ASP.NET Eval 1.1變成ASP.NET Eval 2.0的時候,在操作的時候會有什么變化呢?
    2013-04-04
  • asp.net偽靜態(tài)配置備忘

    asp.net偽靜態(tài)配置備忘

    我在訪問一個網(wǎng)站的時候,總是習(xí)慣性的先查看打開的網(wǎng)站url,如果發(fā)現(xiàn)有類似&符號,心里就會產(chǎn)生一種比較別扭的感覺,這也許和我以前利用這種方式破解網(wǎng)站而養(yǎng)成的習(xí)慣有關(guān)吧。
    2010-11-11
  • Request.UrlReferrer中文亂碼解決方法

    Request.UrlReferrer中文亂碼解決方法

    參考了網(wǎng)絡(luò)大部分的解決方案,沒一個能搞定的,如果窮途末路,試試下面的方法:將獲得的前一頁面的URL分成兩段,后面的參數(shù)部分進行編碼(直接對URL編碼是不行的),然后再組合一下就可以了,需要的朋友可以了解下
    2012-12-12
  • .net core 基于Hangfire+Mysql持久化實現(xiàn)定時任務(wù)配置方法

    .net core 基于Hangfire+Mysql持久化實現(xiàn)定時任務(wù)配置方法

    這篇文章主要介紹了.net core 基于Hangfire+Mysql持久化實現(xiàn)定時任務(wù)配置方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07

最新評論

乐都县| 镇康县| 洛浦县| 郴州市| 嘉兴市| 信宜市| 姜堰市| 扶沟县| 福州市| 鄂托克前旗| 普安县| 正镶白旗| 天镇县| 金溪县| 高陵县| 黄冈市| 灌阳县| 区。| 伊春市| 旺苍县| 金堂县| 老河口市| 临朐县| 上栗县| 庄河市| 万州区| 会理县| 华安县| 正定县| 曲麻莱县| 海晏县| 日土县| 晋城| 通渭县| 子洲县| 定边县| 四子王旗| 固镇县| 尼木县| 罗山县| 剑川县|