全网整合营销服务商

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

免费咨询热线: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关于生成纯静态后如何不再走路由直接访问静态页面  # 路由表  # 可以看到  # 这是  # 第一个  # 三种  # 默认值  # 象中  # 都是  # 是因为  # 都不  # 有个  # 在这个  # 是怎么  # 些什么  # 将其  # 没办法  # 微软  # 带来了  # 再来  # 如果没有 


相关文章: 建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  如何快速查询网址的建站时间与历史轨迹?  如何在阿里云服务器自主搭建网站?  ,石家庄四十八中学官网?  如何基于云服务器快速搭建个人网站?  ,柠檬视频怎样兑换vip?  名字制作网站免费,所有小说网站的名字?  微信小程序 input输入框控件详解及实例(多种示例)  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  网站制作员失业,怎样查看自己网站的注册者?  ,想在网上投简历,哪几个网站比较好?  北京制作网站的公司,北京铁路集团官方网站?  网站制作模板下载什么软件,ppt模板免费下载网站?  ui设计制作网站有哪些,手机UI设计网址吗?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  建站之星3.0如何解决常见操作问题?  如何在阿里云高效完成企业建站全流程?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  一键网站制作软件,义乌购一件代发流程?  建站之星代理费用多少?最新价格详情介绍  如何注册花生壳免费域名并搭建个人网站?  如何解决ASP生成WAP建站中文乱码问题?  如何在IIS7上新建站点并设置安全权限?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  如何快速搭建高效WAP手机网站?  官网网站制作腾讯审核要多久,联想路由器newifi官网  建站之星导航菜单设置与功能模块配置全攻略  ,怎么在广州志愿者网站注册?  javascript中的try catch异常捕获机制用法分析  网站设计制作公司地址,网站建设比较好的公司都有哪些?  淘宝制作网站有哪些,淘宝网官网主页?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何选择最佳自助建站系统?快速指南解析优劣  网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?  油猴 教程,油猴搜脚本为什么会网页无法显示?  魔方云NAT建站如何实现端口转发?  如何续费美橙建站之星域名及服务?  建站主机是什么?如何选择适合的建站主机?  seo网站制作优化,网站SEO优化步骤有哪些?  焦点电影公司作品,电影焦点结局是什么?  如何选择香港主机高效搭建外贸独立站?  如何在建站之星网店版论坛获取技术支持?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  潮流网站制作头像软件下载,适合母子的网名有哪些?  家具网站制作软件,家具厂怎么跑业务?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  详解jQuery中基本的动画方法 

您的项目需求

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