zoukankan      html  css  js  c++  java
  • ASP.net 的URL路由选择(System.Web.Routing.dll)

    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

  • 相关阅读:
    localStorage和sessionStorage区别(包括同源的定义)
    跨域问题实践总结! 上(JSONP/document.domain/window.name)
    7月11日计划
    图形验证码知识点整理 Object.prototype.toString.call()等
    学习日报 7-10(验证码)
    Mysql安装与主从配置
    windows service编程
    Entity Framework——常见报错总结
    Entity Framework——读写分离
    Entity Framework——执行sql语句
  • 原文地址:https://www.cnblogs.com/BluceLee/p/3679049.html
Copyright © 2011-2022 走看看