全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

剖析Asp.Net路由系统实现原理

对于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给前端页面。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# asp.net  # 路由  # 路由配置  # ASP.NET Core中使用默认MVC路由的配置  # ASP.NET Core MVC 配置全局路由前缀  # 解读ASP.NET 5 & MVC6系列教程(11):Routing路由  # 浅析ASP.NET路由模型工作原理  # 为ASP.NET MVC及WebApi添加路由优先级  # asp.net不用设置iis实现url重写 类似伪静态路由  # asp.net mvc路由篇 如何找到 IHttpHandler方法介绍  # ASP.NET MVC3关于生成纯静态后如何不再走路由直接访问静态页面  # 路由表  # 可以看到  # 这是  # 第一个  # 三种  # 默认值  # 象中  # 都是  # 是因为  # 都不  # 有个  # 在这个  # 是怎么  # 些什么  # 将其  # 没办法  # 微软  # 带来了  # 再来  # 如果没有 


相关文章: 建站三合一如何选?哪家性价比更高?  网站制作的步骤包括,正确网址格式怎么写?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何使用Golang table-driven基准测试_多组数据测量函数效率  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站制作壁纸教程视频,电脑壁纸网站?  ,网页ppt怎么弄成自己的ppt?  建站之星安装后如何配置SEO及设计样式?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  教学网站制作软件,学习*后期制作的网站有哪些?  如何通过西部建站助手安装IIS服务器?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在IIS7上新建站点并设置安全权限?  湖北网站制作公司有哪些,湖北清能集团官网?  建站主机空间推荐 高性价比配置与快速部署方案解析  建站org新手必看:2024最新搭建流程与模板选择技巧  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何快速搭建高效可靠的建站解决方案?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  建站为何优先选择香港服务器?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  深圳网站制作平台,深圳市做网站好的公司有哪些?  高防服务器租用如何选择配置与防御等级?  红河网站制作公司,红河事业单位身份证如何上传?  已有域名和空间如何搭建网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  简单实现Android文件上传  招商网站制作流程,网站招商广告语?  学校为何禁止电信移动建设网站?  如何在橙子建站上传落地页?操作指南详解  如何彻底卸载建站之星软件?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何用狗爹虚拟主机快速搭建网站?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何获取上海专业网站定制建站电话?  建站之星后台管理如何实现高效配置?  如何在新浪SAE免费搭建个人博客?  c++怎么用jemalloc c++替换默认内存分配器【性能】  建站主机选哪种环境更利于SEO优化?  制作网站的模板软件,网站怎么建设?  如何快速建站并高效导出源代码?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  深圳网站制作的公司有哪些,dido官方网站?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  网站制作企业,网站的banner和导航栏是指什么?  ,网站推广常用方法?  建站主机核心功能解析:服务器选择与网站搭建流程指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。