asp.net 路由学习一

从今天开始打算好好学习《ASP.NET MVC5 框架揭秘》这本书,希望让水平来一个质的提高,当然学习笔记还是要写的。

asp.net路由:IIS为我们提供里重写url机制,但是这在iis级别上解决了url与物理地址的分离,它的实现依赖于一个注册到IIS管道上的本地代码模块,而asp.net路由则是asp.net机制的一部分,并且是通过托管代码写的。那么到底asp.net机制是什么?首先理解一些常用类和对象。

   1.RouteBase类。

路由系统的核心是Route对象,每一个路由注册(不同的url模式)对应的就是一个Route对象,这些Route对象注册到同一个Web应用中构成一个路由表。Route对象存储在RouteTable类里的静态属性Routes表示,这个属性返回一个RouteCollection对象。这里Route泛指继承自抽象类RouteBase的某个类型的对象

public abstract class RouteBase
        {
            //实现在GetRouteData方法中的路由解析是为了获取路由数据
            public abstract RouteData GetRouteData(HttpContextBase httpContext);
            //GetVirtualPath方法则通过路由解析生成一个完整的虚拟路径
            public abstract VirtualPathData GetVirtualPath(
                RequestContext requestContext,RouteValueDictionary values);
            //它表示是否对现有的物理文件实施路由,默认值为true,即不能通过url访问现有物理文件,只能通过路由注册表。
            public bool RouteExistingFiles { get; set; }
        }

GetRouteData返回了一个RouteData对象,它用于封装路由数据。RouteData具有一个RouteBase的属性Route,该属性返回生成此RouteData的Route对象。其中还有

DataTokens和Values两个属性,这两个属性都返回RouteValueDictionary对象。RouteValueDictionary是一个实现了IDictionary<string,objects>接口的字典,用来保存路由变量。存储于Values和DataTokens的差别是:Values是解析请求url得到的;DataTokens是直接附加到路由对象上的自定义变量。RouteData类里还有一个非常重要的属性:RouteHandler,它在整个路由系统中具有重要的地位,因为最终用于处理请求的HttpHandler对象由它来提供

GetVirtualPath返回了一个VirtualPathData对象。此方法被执行时,如果定义的路由模板中的变量与指定变量列表相匹配,它会使用指定的路由变量值去替换模板里的占位符,这样就得到了虚拟路径。生成的虚拟路径与Route对象最终被封装成一个VirtualPathData对象作为返回值。这个方法里还有一个参数,类型为RequestContext。

    public class RequestContext
    {
        //初始化 System.Web.Routing.RequestContext 类的新实例。
        public RequestContext();

        //httpContext:一个对象,该对象包含有关 HTTP 请求的信息
        //routeData: 一个对象,该对象包含有关与当前请求匹配的路由的信息
        public RequestContext(HttpContextBase httpContext, RouteData routeData);

        // 摘要:  获取有关 HTTP 请求的信息。
        // 返回结果: 一个对象,该对象包含有关 HTTP 请求的信息。
        public virtual HttpContextBase HttpContext { get; set; }

        // 摘要: 获取有关所请求路由的信息。
        // 返回结果: 一个对象,该对象包含有关所请求路由的信息。
        public virtual RouteData RouteData { get; set; }

2.Route类

RouteBase是一个抽象类,在ASP.NET路由系统的应用编程接口中,Route类型是其唯一的直接继承者。这个类里面有一个Url属性,它代表绑定在该路由对象上的路由模板。当请求过来时,就根据Route对象里的Url属性与请求的url匹配,这就是路由解析。

Route类型除了核心属性Url外,还有一些其他属性。Constraints为模板中的的变量设置一些约束条件,该属性类型为RouteValueDictionary,其key和Value分别为变量名和作为约束的正则表达式;Defaults同样也返回一个RouteValueDictionary对象,它保存了为路由变量定义的默认值。Route类型的DataTokens用于存储一些额外的路由变量,这些路由变量不会参与针对请求的路由解析,但对于调用Route类型的GetRouteData和GetVirtualPath方法得到的对象里的DataTokens包含的路由变量都来源于此。

这本书感觉真有点难,明天继续!

时间: 07-27

asp.net 路由学习一的相关文章

asp.net 路由学习三

5.根据路由规则生成url ASP.NET路由系统主要有2个方面的应用:通过注册路由模板与物理文件路径的映射实现url和物理地址的分离:通过注册的路由规则生成完整的url:前者通过RouteCollection对象的GetRouteData方法实现,后者通过RouteCollection对象的GetVirtualPath方法实现.再来看看GetVirtualPath这个方法 //共同的参数requestContext表示请求上下文,也就是RouteData和Http上下文的封装, //value

asp.net 路由学习四

8.链接和url的生成 ASP.NET路由系统总的功能可以描述为实现两个方向的路由解析,即针对入栈请求拿到请求的路由和出栈url的生成.对此,ASP.NET MVC定义了两个帮助类,分别为HtmlHelper类和UrlHelper类,这两个类可以根据注册的路由规则生成相应的链接或者url.从本质上来看,这2个类还是依赖于前面的GetVirtualPathData方法.接下来先来看一下UrlHelper类的部分代码 public class UrlHelper { public UrlHelper

asp.net 路由学习二

3.RouteTable类 我们所说的路由注册的本质就是创建相应的Route对象并将它加入到RouteTable的静态属性Routes表示的全局路由表.先看一下RouteTable, public class RouteTable { public static RouteCollection Routes{get;} } 可以看到RouteTable返回一个RouteCollection对象,显而易见全局路由表应该就在这个对象中.接下来看一下RouteCollection类, public c

ASP.NET MVC学习之路由篇(1)

原文:ASP.NET MVC学习之路由篇(1) 一.前言 作为一个从ASP.NET转入到ASP.NET MVC的开发人员而言,可能在开发ASP.NET网站的时候就已经开始在使用路由了. 只不过在ASP.NET MVC中路由是关键部分,而在ASP.NET中需要自行加进去.下面我们将学习ASP.NET MVC中的路由 系统. 二.准备工作 1.新建一个ASP.NET MVC4项目 2.模板选择空 3.在Controllers中添加一个Home控制器 4.打开App_Start中的RouteConfi

学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(六)

4.Route RouteBase是一个抽象类,在ASP.NET路由系统的应用编程接口中,Route类型是其唯一的直接继承者,在默认的情况下调用RouteCollection的MapPageRoute方法在路由表中添加的就是这么一个对象.如下面的代码片段所示,Route类型具有一个字符串类型的属性Url,它代表绑定在路由对象上的路由模板. public class Route : RouteBase { public Route(string url,IRouteHandler routeHan

学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(十一)

3.对现有物理文件的路由 在成功注册路由的情况下,如果我们按照传统的方式访问一个现存的物理文件,在请求地址满足某个Route的路由规则,ASP.NET是否还能正常实施路由呢?我们不妨通过实例来测试一下.为了让针对某个物理文件的访问地址也满足注册路由对象的路由模板采用的URL模式,我们需要按照如下的方式在进行路由注册时将表示约束的参数设置为Null. public class Global : System.Web.HttpApplication { protected void Applicat

学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(十)

1.变量默认值 由于我们为定义在URL模板中表示区号和天数的变量定义了默认值(areacode:010:days:2)如果希望返回返回北京未来两天的天气,可以直接访问应用根地址,也可以只指定具体区号,或者同时指定区号和天数. 默认情况下RouteData的Route属性返回的正是一个Route类型的对象,RouteHandler属性返回的则是一个PageRouteHandler的对象.针对请求URL实施路由解析得到的路由变量被保存在生成RouteData对象的Values属性中,而在路由注册过程

学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(四)

2.RouteData 我们现在来看看用于封装路由数据同时作为GetRouteData方法返回值的RouteData.如下面代码片段所示,RouteData具有一个类型为RouteBase的属性Route,该属性返回生成此RouteData的Route对象.不过这是一个可读/写的属性,我们可以使用任意一个Route对象来对此属性进行赋值. public class RouteData { public RouteData(); public RouteData(RouteBase route,I

学习ASP.NET MVC5框架揭秘笔记-ASP.NET路由(三)

Route和RouteTable ASP.NET路由系统的核心是注册的Route对象,一个Route对象对应着一个路由模板,多个具有不同URL模式的Route对象可以注册到同一个Web应用中,他们构成了一个路由表.这个包含所有注册Route对象的路由表通过RouteTable类的静态属性Routes表示,该属性返回一个RouteCollection对象. 1.RouteBase 我们所说的Route泛指的是继承自抽象类RouteBase的某个类型的对象.RouteBase具有两个返回类型分别为R