System.Web.Routing是.net 3.5sp1中新增的一个dll,用它提拱的类可以很方便的实现url的映射,在asp.net WebFrom的编程中可以使客户端请求的URL变得更加的"酷",当然它的最大作用应该还是服务于ASP.net MVC的框架中。

UrlRouting 的实现原理实际上并不复杂,在System.Web.Routing空间中有一个类 UrlRoutingModule,它实现了IHttpModule接口,并订阅了HttpApplication对象的 PostResoleRequestCache与PostMapRequestHandler两个事件,在第一个事件中UrlRoutingModule 为本次请求准备一个HttpHandler并在第二个事件中将HttpHandler交给HttpContext。其中 PostResolveRequestCache的部分代码如下:

private void OnApplicationPostResolveRequestCache(object sender, EventArgs e)
    {
        HttpContextBase context = new HttpContextWrapper(((HttpApplication) sender).Context);
        this.PostResolveRequestCache(context);
    }

public virtual void PostResolveRequestCache(HttpContextBase context)
    {
        RouteData routeData = this.RouteCollection.GetRouteData(context);
        if (routeData != null)
        {
            IRouteHandler routeHandler = routeData.RouteHandler;  
            if (routeHandler == null)
            {
               
throw new
InvalidOperationException(string.Format(CultureInfo.CurrentUICulture,
RoutingResources.UrlRoutingModule_NoRouteHandler, new object[0]));
            }
            if (!(routeHandler is StopRoutingHandler))
            {
                RequestContext requestContext = new RequestContext(context, routeData);
                IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
                if (httpHandler == null)
                {
                   
throw new
InvalidOperationException(string.Format(CultureInfo.CurrentUICulture,
RoutingResources.UrlRoutingModule_NoHttpHandler, new object[] {
routeHandler.GetType() }));
                }
                RequestData data2 = new RequestData();
                data2.OriginalPath = context.Request.Path;
                data2.HttpHandler = httpHandler;
                context.Items[_requestDataKey] = data2;
                context.RewritePath("~/UrlRouting.axd");
            }
        }
    }
代码说明:

1.  
HttpContextBase是一个抽象类,它的成员与HttpContext是完全一样的,HttpContextWrapper继承于
HttpContextBase,并且将HttpContext对象作为自己的一个成员,它的方法实现完全是依赖于HttpContext对象来实现的。
HttpContextBase与HttpContextWrapper都是在System.Web.Abstractions.dll中,这个DLL也
是.net sp1新增的,它的主要作用是服务于asp.net 的单元测试。

2.  RouteData是与于当前请求URL配置相对应的一个路由数据。URL路由类Route是要我们来配置的并将其添加到
RouteTable的Routes集合中,RouteTable使用了SingleTon设计模式,所以它是线程安全的并且整个应用程序共用一个
RouteTable对象,因此我们要向RouteTable添加Route时必须在Global.asax的Application_Start事件中
完成。

3.   方法从RouteData中获取获取一个RouteHandler对象,这个对象是IRouteHandler接口的实现,在.net
sp1中并没有可以直接使用的IRouteHandler的实现,所以需要我们自己实现,实现它的目的也就是创建一个当前Route的可用的
HttpHandler.

PostMapRequestHandler的代码实现:

private void OnApplicationPostResolveRequestCache(object sender, EventArgs e)
    {
        HttpContextBase context = new HttpContextWrapper(((HttpApplication) sender).Context);
        this.PostResolveRequestCache(context);
    }

public virtual void PostMapRequestHandler(HttpContextBase context)
    {
        RequestData data = (RequestData) context.Items[_requestDataKey];
        if (data != null)
        {
            context.RewritePath(data.OriginalPath);
            context.Handler = data.HttpHandler;
        }
    }

代码说明:就是将上面获得的HttpHandler对象交给HttpContext的Handler属性。

如果我要在ASP.net WebFrom中用使用UrlRoute必须完成三件事:

1.实现IHttpHandler接口

2.实现IRouteHandler接口,根据RequestContext的RouteData属性返回相对应的IHttpHandler对象

3.配置Route路由将IRouteHandler对象赋给Route对象的Handler,并将Route添加到RouteTable的Routes集合中

下面我们就可以在ASP.net WebFrom中使用URLRouting并让我们的URL变得更"酷"(待续……)

地址:http://blog.csdn.net/heroyuchao/article/details/4158895

ASP.net 的URL路由选择(System.Web.Routing.dll)的更多相关文章

  1. 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)

    原文:返璞归真 asp.net mvc (2) - 路由(System.Web.Routing) [索引页] [源码下载] 返璞归真 asp.net mvc (2) - 路由(System.Web.R ...

  2. System.Web.Mvc.dll在各个版本MVC中的文件位置

    the default folder would be like the following: MVC 5 C:\Program Files (x86)\Microsoft ASP.NET\ASP.N ...

  3. 【ASP.NET】System.Web.Routing - RouteCollection Class

    Provides a collection of routes for ASP.NET routing. The RouteCollection class provides methods that ...

  4. 【ASP.NET】System.Web.Routing - PageRouteHandler Class

    用于提供一些属性和方法来定义如何将URL匹配到一个物理文件上面. public PageRouteHandler (string virtualPath, bool checkPhysicalUrlA ...

  5. 【ASP.NET】System.Web.Routing - HttpMethodConstraint Class

    你可以自己定义你的ASP.NET程序接收的get post put 或者delete请求. 使用这个约束的方式为: void Application_Start(object sender, Even ...

  6. System.Web.Routing入门及进阶 上篇

    System.Web.Routing已经作为一个程序集包含在.net3.5sp1中发布了.虽然我们并没有在3.5sp1中发现Asp.net Mvc的踪迹,但是亦以感觉到它离我们不远了. System. ...

  7. System.Web.Routing入门及进阶 下篇

    上面介绍的是最简单的一种定义方式.当然我们可以建立更复杂的规则.其中就包括设定规则的默认值以及设定规则的正则表达式. UrlRouting高级应用 预计效果: 当我访问/a/b.aspx时就会转到De ...

  8. vs2010编辑器中找不到System.Web.Extensions.dll

    vs2010编辑器中想添加System.Web.Extensions.dll引用,却发现引用不了: 排除办法: 1.找到自己VS2010中System.Web.Extensions.dll的所在位置, ...

  9. 安装升级System.Web.Optimization.dll

    今天在使用backload时,VS提示solution所引用的System.Web.Optimization.dll 版本低,编译不过,于是便删掉,从新添加引用,悲剧的是在添加引用窗口中没找到,在Nu ...

随机推荐

  1. java算法小知识练习

    偶尔翻开了以前的练习题,不自觉又想随手敲一遍,虽然有些思想依然是那么老套,但毕竟也算是对知识的巩固 了. 一.题目:有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 具体 ...

  2. jqgrid项目使用记录/注释版/未整理/

    jqgrid项目使用笔记function loadActData(){ $("#actGridTable").clearGridData();//首先清空表格内容 var url ...

  3. spark向量、矩阵类型

    先来个普通的数组: scala> var arr=Array(1.0,2,3,4) arr: Array[Double] = Array(1.0, 2.0, 3.0, 4.0) 可以将它转换成一 ...

  4. [Guava官方文档翻译] 1.Guava简介 (Introduction)

    用户指南 Guava包含Google在Java项目中用到的一些核心库:collections, caching, primitives support, concurrency 库, common a ...

  5. 九度OJ 1501 最大连续子序列乘积 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1501 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含 ...

  6. 九度OJ 1480 最大上升子序列和 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1480 题目描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列 ...

  7. OpenJudge/Poj 1458 Common Subsequence

    1.链接地址: http://poj.org/problem?id=1458 http://bailian.openjudge.cn/practice/1458/ 2.题目: Common Subse ...

  8. Headfirst设计模式的C++实现——迭代器(Iterator)改良版

    iterator.h #ifndef _ITERATOR_H_ #define _ITERATOR_H_ class Iterator { public: ; ; }; #endif menu.h # ...

  9. 文件服务——Vsftpd

    文件传输协议(FTP): 能够让用户在互联网中上传.下载文件的文件协议,FTP服务就是支持FTP传输协议的主机,要想完成文件传输则需要FTP服务端和FTP客户端的配合才行. 通常用户使用FTP客户端软 ...

  10. 构造SEH来实现跳转-转载

    下面的代码出自CSDN Delphi版的一高人(kiboisme 蓝色光芒) procedure ExceptProc{ExceptionRecord,SEH,Context,DispatcherCo ...