zoukankan      html  css  js  c++  java
  • MVC路由解析---UrlRoutingModule

    文章引导

                  MVC路由解析---IgnoreRoute 

                  MVC路由解析---MapRoute 

                  MVC路由解析---UrlRoutingModule  

                  Area的使用

    引言:

                    此文全文内容90%转自

    一.前言

                    在MVC中,一个请求对应一个Controller的Action,熟悉asp.net的人应该知道,asp.net请求实际交给了HttpHandler进行了处理,HttpHandler就是ASP.NET的处理器。MVC的Action,请求都会交给HttpHandler。具体是在管道事件中,会根据请求创建一个HttpHandler,执行HttpHandler的ProcessRequest方法。

    二.UrlRoutingModule

                    MVC的路由机制是通过一个UrlRoutingModule完成的,它是一个实现了IHttpModule的类,HttpModule通过注册HttpApplication事件参与到管道处理请求中。具体是订阅HttpApplication某个阶段的事件。废话不多说,上源码

    public class UrlRoutingModule:IHttpModule
    {
        public RouteCollection _routeCollection;
      
        protected virtual void Init(HttpApplication application)
        {
             application.PostResolveRequestCache+=OnApplicationPostResolveRequestCache;
        }
    
        void OnApplicationPostResolveRequestCache(object sender,EventArgs e)
        {
              HttpApplication app=(HttpApplication)sender;
              HttpContextBase context=new HttpContextWrapper(app.Context);
              PostResolveRequestCache(context);
        }
    
        public virtual void PostResolveRequestCache(HttpContextBase context)
        {
              RouteData routeData=RouteCollection.GetRouteData(context);
              
              IRouteHandler routeHandler=routeData.RouteHandler;
    
              RequestContext requestContext=new RequestContext(context,routeData);
              context.Request.RequestContext=requestContext;
        
              IHttpHandler httpHandler=routeHandler.GetHttpHandler(requestContext);
              context.RemapHandler(httpHandler);
        }
    }

                      我们看看UrlRoutingModule的路线图               

                              

                    Route.GetRouteData:

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
         //AppRelativeCurrentExecutionFilePath:获取应用程序的虚拟路径,并通过对应用程序根使用波形符(~)表示法,(例:~/page.aspx)使该路径成为相对路径。
         //HttpRequest.PathInfo:获取扩展名的附加信息,例:对于 URL Http://www.contoso.com/virdir/page.html/tail,PathInfo 值为 /tail。
         string requestPath=httpContext.Request.AppRelativeCurrentExecutionFilePath.SubString(2)+httpContext.Request.PathInfo;
           
         RouteValueDictionary values=_parseRoute.Match(requestPath,Defaults);
    
         RouteData routeData=new RouteData(this,RouteHanlder);
    
         foreach(var item in values)
         {
              routeData.Values.Add(item.Key,value.Value);
         }
    
         //DataTokens
    }

                     GetRouteData通过HttpContext来获取路由信息,形成RouteData,将URL与Defaults的Key进行匹配,形成RouteValueDictionary ,我们看看RouteData内部信息

                                    属性:Route--->RouteData有参构造函数的参数Route

                                               RouteHandler--->RouteData有参构造函数的参数IRouteHandler

                                    方法:GetRouteData---->return RouteData

                                               GetRequiredString---->string

                     上述的RouteHandler由Route的构造函数参数传入,  这里的Route来自于

                       

                                                  

                                

  • 相关阅读:
    [HNOI2008]玩具装箱toy(dp+斜率优化)
    hdu 4597 Play Game(记忆化搜索)
    下载文件,ie文件名称乱码问题
    HDU 2138 How many prime numbers
    Codeforces Round #277 (Div. 2)---A. Calculating Function (规律)
    MapReduce-MulitipleOutputs实现自己定义输出到多个文件夹
    EFM8单片机与I2C外设通信
    linux杂谈(十一):LDAPserver的搭建
    Redis命令学习-string类型操作
    Java 实现单链表反序
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/9244430.html
Copyright © 2011-2022 走看看