读书人

asp.net mvc源码分析-路由篇 怎么找到

发布时间: 2012-11-15 15:16:15 作者: rapoo

asp.net mvc源码分析-路由篇 如何找到 IHttpHandler

学习是使用asp.net已经有很长一段时间了,现在就来分析一下mvc的整过过程吧。个人计划写一个mvc系列的博文,仅从源代码的角度来分析mvc。在接触mvc时我们一定会经历路由,那么路由这东东是怎么搞出来的啊。在我们的web.config中有这么一句: <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 看来路由是它咋负责了。在这个dll中有一个很特殊的类UrlRoutingModule

我们来看看它里面主要的核心代码吧:

public override RouteData GetRouteData(HttpContextBase httpContext){    string virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;    RouteValueDictionary values = this._parsedRoute.Match(virtualPath, this.Defaults);    if (values == null)    {        return null;    }    RouteData data = new RouteData(this, this.RouteHandler);    if (!this.ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest))    {        return null;    }    foreach (KeyValuePair<string, object> pair in values)    {        data.Values.Add(pair.Key, pair.Value);    }    if (this.DataTokens != null)    {        foreach (KeyValuePair<string, object> pair2 in this.DataTokens)        {            data.DataTokens[pair2.Key] = pair2.Value;        }    }    return data;}
这个方法很复杂,有许多验证和检查,我们主要关心一句 RouteData data = new RouteData(this, this.RouteHandler);

当然剩下 RequestContext requestContext = new RequestContext(context, routeData);
context.Request.RequestContext = requestContext;这2句没什么特别了。

现在让我们来看看IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);这句究竟干了些什么,意思很明白获取Httphandler。

那么MvcRouteHandler是如何获取一个Httphandler的了,
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext) {
requestContext.HttpContext.SetSessionStateBehavior(GetSessionStateBehavior(requestContext));
return new MvcHandler(requestContext);
}

直接返回了一个MvcHandler实例。

最有一句context.RemapHandler(httpHandler); 很简单很好明白吧,在HttpContext的RemapHandler方法中有这么一句 this._remapHandler = handler;

在HttpContext中有这个属性

internal IHttpHandler RemapHandlerInstance
{
get
{
return this._remapHandler;
}
}

那么这个东西又是什么时候调用的了,在HttpApplication的内部类MaterializeHandlerExecutionStep中的 void HttpApplication.IExecutionStep.Execute()方法调用

if (httpContext.RemapHandlerInstance != null)
{
httpContext.Handler = httpContext.RemapHandlerInstance;
}

看到MaterializeHandlerExecutionStep这个了类名,我想大家都能猜到吧。在内部类PipelineStepManager中BuildSteps方法有

HttpApplication.IExecutionStep step = new HttpApplication.MaterializeHandlerExecutionStep(app);
app.AddEventMapping("ManagedPipelineHandler", RequestNotification.MapRequestHandler, false, step);

我想大家看到这里对mvc整个路由应该有个大致的理解了吧。

2楼dz45693昨天 12:46
通过反编译工具Reflector.exe
1楼C_HHHHHHHHHHHHHH昨天 12:31
博主是怎么看到函数的实现代码的啊????

读书人网 >ASP

热点推荐