asp.net 路由学习四

8.链接和url的生成

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

public class UrlHelper
        {
            public UrlHelper(RequestContext requestContext);
            public UrlHelper(RequestContext requestContext, RouteCollection routeCollection);
            //从这两个属性可以看出,一个UrlHelper对象实际上就是对请求上下文RequestContext对象和路由表RouteCollection对象的封装
            //如果在构造UrlHelper的时候没有通过参数指定RouteCollection对象,那么通过RouteTable的静态属性Routes表示的全局路由表将会被使用
            public RequestContext RequestContext { get; }
            public RouteCollection RouteCollection { get; }
            //多个重载的action方法
            public string Action(string actionName);//多个重载的RouteUrl方法public string RouteUrl(RouteValueDictionary routeValues);
        }

HtmlHelper类和UrlHelper类的基本原理都差不多,只是HtmlHelper只在View中使用,因此我现在主要学习UrlHelper类。接下来根据书上的例子尝试创建等效帮助类,

            public string Action(string actionName, string controllerName = null, RouteValueDictionary routeValues = null, string protocol = null, string hostName = null)
            {
                //可以看到,如果controllerName为空,则会获取当前Controller名称
                controllerName = controllerName ?? this.RequestContext.RouteData.GetRequiredString("controller");
                RouteValueDictionary routeValueDictionary = new RouteValueDictionary(routeValues);
                routeValueDictionary.Add("action", actionName);
                routeValueDictionary.Add("controller", controllerName);
                string virtualPath = this.RouteCollection.GetVirtualPath(this.RequestContext, routeValueDictionary).VirtualPath;
                //如果没有显示指定传输协议,和主机名称,则返回相对路径
                if (string.IsNullOrEmpty(protocol) && string.IsNullOrEmpty(hostName))
                {
                    return virtualPath.ToLower();
                }
                //假如没有显示指定协议,则默认为http
                protocol = protocol ?? "http";
                //假如没有指定主机名称,则默认使用当前请求的主机名称并使用当前的端口
                Uri uri = this.RequestContext.HttpContext.Request.Url;
                hostName = hostName ?? uri.Host + ":" + uri.Port;
                return string.Format("{0}://{1}{2}", protocol, hostName, virtualPath).ToLower();
            }

在UrlHelper类里面我们可以看到还有一个很重要的方法,RouteUrl()。UrlHelper的Action方法和HtmlHelper的ActionLink方法的URL都是通过路由表的RouteCollection对象生成出来的,默认情况下就是全局路由表。但有时候我们是需要针对匹配的Route对象来生成URL或者链接,这时就要用到RouteUrl了。在HtmlHelper里这个方法叫RouteLink。没有显示指定Route注册名称时,RouteUrl会利用整个全局路由表;如果显示指定了Route的注册名称,则会查找对应的Route对象;如果不匹配则返回null。

9.动态HttpHandler映射

在ASP.NET机制中,一般情况下一个请求最终是通过一个HttpHandler来处理的,表示一个Web页面的Page对象就是一个HttpHandler,它最终用于处理某个.aspx的请求。我们也可以通过HttpHandler的动态映射来实现请求地址与物理地址的分离。ASP.NET机制可以理解为请求Request到达,HttpModule进行拦截,同时生成HttpHandler对象,它将接管对当前请求的处理并最终发送请求Response。我们可以看下实现了IHttpModule接口的类

        public class UrlRoutingModule : IHttpModule
        {
            //默认情况下该属性是对RouteTable的静态属性Routes的引用
            public RouteCollection RouteCollection { get; set; }
            protected virtual void Init(HttpApplication application)
            {
                application.PostResolveRequestCache += new EventHandler(this.OnApplicationPostResolveRequestCache);
            }
            //HttpHandler的动态映射就实现在下面方法中,执行时会利用HttpApplication得到HttpContext对象,然后创建HttpContextWrapper对象
            //接下来UrlRoutingModule将这个对象作为参数调用RouteCollection对象的GetRouteData方法对当前实施路由解析,如果返回一个具体的RouteData对象
            //那么它会通过RouteHandler属性得到对应Route采用的RouteHandler,最后在RouteHandler调用GetHttpHandler得到需要被动态映射的HttpHandler对象
            private void OnApplicationPostResolveRequestCache(object sender, EventArgs e);
        }

对于一个ASP.NET MVC应用来说,Route对象是通过调用RouteCollection的扩展方法MapRoute进行注册的,它的RouteHandler属性返回一个MvcRouteHandler对象,整个MVC框架就实现在这个MvcHandler中。书上最后还进行了一个定制路由的总结,我感觉我还是没有理解得很透彻:

1通过继承抽象类RouteBase创建自定义Route类型定制路由。

2通过实现接口IRouteHandler创建自定义RouteHandler定制HttpHandler提供机制。

3通过实现IHttpHandler创建自定义HttpHandler来对请求进行处理并作最终的响应。

时间: 2024-07-29 00:39:47

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

学习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 路由学习一

从今天开始打算好好学习<ASP.NET MVC5 框架揭秘>这本书,希望让水平来一个质的提高,当然学习笔记还是要写的. asp.net路由:IIS为我们提供里重写url机制,但是这在iis级别上解决了url与物理地址的分离,它的实现依赖于一个注册到IIS管道上的本地代码模块,而asp.net路由则是asp.net机制的一部分,并且是通过托管代码写的.那么到底asp.net机制是什么?首先理解一些常用类和对象.    1.RouteBase类. 路由系统的核心是Route对象,每一个路由注册(不

asp.net 路由学习三

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

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路由(三)

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