惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
L
LINUX DO - 热门话题
P
Proofpoint News Feed
P
Privacy & Cybersecurity Law Blog
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Cisco Talos Blog
Cisco Talos Blog
AI
AI
L
LINUX DO - 最新话题
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The GitHub Blog
The GitHub Blog
I
Intezer
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
S
Securelist
博客园_首页
IT之家
IT之家
Schneier on Security
Schneier on Security
博客园 - 叶小钗
罗磊的独立博客
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
W
WeLiveSecurity
The Register - Security
The Register - Security
D
DataBreaches.Net
S
Security @ Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
Recorded Future
Recorded Future
NISL@THU
NISL@THU
N
News and Events Feed by Topic
T
Tailwind CSS Blog
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
T
Tor Project blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com

博客园 - 老公鸡

sharepoint 2010? Jsp中使用数据库连接池. Oracle 基础学习之索引 Oracle基础学习之函数 Oracle 基本操作之sql语句 Oracle基本操作 Oracle 数据库学习一 小黑日记三 结束了 mvc 3 学习 第一天 准备 小黑 成长日记第二天 2011年6月15日,同事捡了一只小猫回来了 NHibernate 学习 第十二天 存储过程的使用 NHibernate 学习 第十一天 对多对的关系处理 NHibernate 学习 第十天 一对多的外键关系处理 NHibernate 学习 第九天 外键关系的处理之一对一 NHibernate学习 第八天 组件的运用 NHibernate学习 第七天 其它的学习资料 NHibernate学习 第六天 NHibernate 中的查询 NHibernate 学习第五天 用户表的增,删,改,查
MVC2 学习之 UrlRouting
老公鸡 · 2011-07-04 · via 博客园 - 老公鸡

一. 什么 UrlRouting?

  用来配置一些URL的映射,使用户可以按你的规则来访问网站.,大家都称它为 url 路由,那我们就把它叫做路由器吧

  使用UrlRouting,一定要规定URL模式,它包括一个位置标识,它将在你请求网页时按这个规则返回给你内容. 当然,这个创建的规则完全是由你自己定义的。

  如我们在上网的时候常见到http://localhost/admin 之类的地址,后面没有接具体的页面,但实际上还是有内容返回给你看的。这就是传说中的伪静态!

二. UrlRouting的优点和缺点

  优点: 可以隐藏你的真实页面,让别人找不到,安全!提高seo优化效果。

  缺点:  里面的规则是需要自己定制,搞不好就系统崩溃。不利于调试。

三. UrlRouting 的规则写在哪里

  1. 在 global.asax 全局文件里面

  2. 在 web.config 里面进行设置

  3. 在另外的xml 文件里面统一存放

四. UrlRouting实现原理

为了方便大家理解我绘制了一个UML图,其中通过RouteTable的Routes这个属性可以获取一个RouteCollection的Singleton模式,虽然在其中并没有判断值不存在时才初始化的Singleton的标志性行为,但是它是在Application_Start事件中进行初始化的,并且直到应用程序进程终结,所以是Singleton模式的。

   

   而通过以下方式将Route添加到RouteTable.Routes中

   RouteTable.Routes.Add(new Route());

   以上代码仅为表示其流程,这个代码是不能正确执行的,因为Route没有提供无参构造函数。

   Route初始化时则是利用RouteValueDictionary来加入默认值及规则到Route中

   另外Route还有一个IRouteHandler的实现对象,IRouteHandler的实现对象提供了一个GetHttpHandler方法来获取用于处理URL的IHttpHandler。

五. UrlRouting的代码实现

  global.asax 文件里面的代码如下:

 public class MvcApplication : System.Web.HttpApplication
    {
        
/// <summary>
        
/// 创建一个路由表
        
/// </summary>
        
/// <param name="routes">路由集合,由asp.net 路由集合提供</param>
        public static void RegisterRoutes(RouteCollection routes)
        {
            
//表示.axd页面不经过路由处理
            
//如果说你有aspx页需要设置可以直接访问的话应该加上
            
//routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");这一句
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
           
            
//1、大家可以回忆一下Controller和Action的定义
            
//因为MVC与传统Aspx的最大不同就是访问是
            
//访问的Controller.Action即某类下的一个函数而不是aspx文件,
            
//要展现给用户哪一个aspx文件是由Controller决定的(即默认的同名规则)
            
//这个是文件默认自带的UrlRouting规则,是将Controller/Action/id的访问
            
//模式指向对应的Controller及Action
            routes.MapRoute(
                
"Default",                                              // 默认路由名称
                "{controller}/{action}/{id}",                           //  这是 url 解析格式 ,大括号括起来的是需要解析的参数 {controller}是找到对应的 控制器,{action}是控制器里面的对应的方法,{id}是默认提供的一个参数名,类似我们以往的 http://localhost/index.aspx?id=XXX 这url里面的id参数

                
new { controller = "Home", action = "Index", id = "" }//参数的默认值也就是如果各部分为空的话访问
               
//HomeController下的Index这个Action
               
//是默认的参数,当没有指定{controller}时 默认 "Home"这个控制器,当没有指定 {action}时 默认"Index" 这个执行方法,类似的  id 就是 如果没有指定{id} 则 使用这里的值
            );

        }

/// <summary>
        
/// 应用程序启动时调用事件
        
/// </summary>
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }

六:  UrlRouting 规则

Ø 定义URL路由

  将用户请求的URL路由解析为一系列的离散值,该URL路由通过占位符定义URL的模式。在URL路由中,通过大括号({})定义占位符,这些占位符就是URL路由参数,而字符串中的“/”、“.”等符号则作为分隔符被URL路由解析这些离散的数据,对于不在小括号或者方括号中的信息则被视为一个常量。

有效的URL路由定义

匹配的URL例子

{controller}/{Action}/{id}

/products/show/beverages

{table}/Details.aspx

/products/ Details.aspx products:表名 Details.aspx为常量

blog/{Action}/{entry}

/ blog(常量) /show(相关控制器重的方法)/123(一个entry变量)

{reporttype}/{year}/{month}/{day}

/salesreporttype变量)/2008year变量)/1month变量)/5day变量)  

Ø 设定URL路由通配符

为了实现对一类URL路由的定义,可以使用星号来定义URL路由通配符。

假定url路由通配符为:query/{queryname}/{*queryvalues},

URL

通配符参数值

/query/select/bikes/onsale

Bikes/onsale

/query/select/bikes

bikes

/query/select

空白字符串

Ø 添加URL路由参数的约束

         Constraints=new RouteValueDictionary{{"locale","{a-z}{2}-{A-Z}{2}"},{year,@"\d{4}"}};

         Locale必须为英文字母,前面2位英文字母必须小写的,后面2位英文字母必须大写的。而year必须是4位数字。

URL

匹配结果

/en-us/2008

不匹配

/en-US/08

不匹配

/en-US/2008

Locale=”en-US”,year=”2008”

Routing的扩展方法

  扩展方法的由来:路由程序集(System.Web.Routing)是在2008年8月11日更新 的.NET 3.5框架SP1版本中发布的,而ASP.NET 3.5 MVC 1.0版本是在2009年3月18日才正式发布。在ASP.NET MVC版本的不断改进中,微软的开发团队感觉到以往的路由设置给开发者带来不便,但是路由的程序集已经发布,如何在路由程序集中添加新的功能呢?所以将扩展方法加在了 System.Web.Mvc程序集的RouteCollectionExtemsion类中。

优化路由设置

Ø 设置路由名称:在路由的设置中,路由名称是可选的输入参数,路由名称可以用来生成URL路由,但是在路由解析中没有什么作用。当开发者使用路由名称来生成url路由的时候,路由模块将快速定位到指定名称的路由。则不会通过查询的方式,一个接一个的查询。而是直接跳转到路由表中的对应路由名称的路由。

Ø 将常用的路由存放在路由表的最前面。该方法不仅提高生成url路由的效率,而且还提高路由解析的效率。这是因为在解析路由的过程中,一旦选找到匹配的路由,就停止路由解析。

但需要说明的是,在改变路由的存放位置时,需要注意路由的次序改变是否实质性影响匹配。