文章引导
引言:
此文全文内容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来自于