对于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小时内与您取得联系。