asp.net mvc 处理流程
回顾一下asp.net的流程处理http://www.cnblogs.com/jianjialin/archive/2011/06/14/2080768.html和http://www.cnblogs.com/jianjialin/archive/2011/06/14/2080880.html
在处理流程里面有两个方法, 我们在这里分析一下
void application_PostResolveRequestCache (object sender, EventArgs e)//下文简称Rvoid application_MapRequestHandler(object sender, EventArgs e)//下文简称MR, 应用程序完成缓存处理, 下一步进入映射构造IhttpHandler步骤.我们在新建的HttpModule里的application_PostResolveRequestCache 方法里设置断点, 发现((HttpApplication)sender).Context.CurrentHandler是null.接下来进入application_MapRequestHandler方法M, 应用程序完成IHttpHandler的构造.此时((HttpApplication)sender).Context.CurrentHandler是根据请求url的后缀, 比如.aspx那么就是页处理程序, 如果是.ashx那么就是handler.注意:1. 如果自定义了处理类型,那么((HttpApplication)sender).Context.CurrentHandler自然就是那个handler2. 如果自定义了处理工厂, 那么处理工厂的getHttphandler方法在application_PostResolveRequestCache 方法之后执行,我们在application_MapRequestHandler方法里可以用((HttpApplication)sender).Context.CurrentHandler得到你在getHttphandler中确定的处理器当然了. ((HttpApplication)sender).Context.CurrentHandler是可读写的, 意思就是说, 在application_MapRequestHandler里面.你可以将处理器设置成任意你喜欢的处理器, 而忽视前面的工作!
OK, 下面进入asp.net mvc 流程. 当然, 这篇文章只是讲解大概的流程, 让你知道走了哪些地方, 具体分析由于本人水平有限, 还请参考我给出的文章或者自行搜索资料
ISAPIRuntime 调用至HttpRuntime , HttpRuntime 通过HttpApplicationFactory 获取HttpApplication,HttpApplication在生成的同时加载了所有的HttpMoudule,并且通过StepManager完
成对管线事件绑定及HttpHandler的加载。然后HttpRuntime 触发HttpApplication 的BeginProcessRequest开始了真正的HttpRequest请求的处理过程。
HttpApplication按照管线StepManager事先设定好的事件触发顺序(asp.net管道事件),当被HttpModule订阅的事件发生,HttpModule根据请求的信息加载对应的HttpHandler到上下文中,并把控制权还给管线。
HttpApplication继续按照管线进行,将所有的HttpHandler加载进来。之后过程中通过HttpModule确定使用哪个HttpHandler处理请求,直到管线调用这个 HttpHandler的ProcessRequest,这个时候HttpHandler才开始着手处理上下文中的请求,比如查找请求的具体页面地址,调用请求的方法,绘制视图等等。
HttpHandler 处理完后,HttpApplication管线又将上下文的控制交还给HttpModule,HttpModule对请求最后处理后,又把控制权还给管线继续处理下面的事件,直到HttpRuntime 结束请求返回客户端。
上文还是asp.net的流程. 我们启动一个asp.net mvc应用程序. 首先进入的是global.cs全局类里面的事件. 我们在Global.asax.cs注册路由的时候(即HttpApplication),就已经往RouteTable.Routes添加了新的路由信息了,因此HttpModule可以从自己的RouteCollection查找到对应请求的路由。RouteTable只有一个静态集合属性RouteCollection。
然后呢, 不写了. 看看高手的东西吧http://www.cnblogs.com/mecity/archive/2011/06/27/2090657.html特别注意
public virtual void PostMapRequestHandler(HttpContextBase context) {RequestData data = (RequestData) context.Items[_requestDataKey];if (data != null) {context.RewritePath(data.OriginalPath);context.Handler = data.HttpHandler;}}这个方法, 这就是为什么asp.net mvc流程中, 应用程序知道使用new MvcRouteHandler()来处理请求.new MvcRouteHandler()在哪定义的? 在public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces) {......Route route = new Route(url, new MvcRouteHandler()) {Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints),
DataTokens = new RouteValueDictionary()
};......}方法中写死了, 程序启动的时候就设置好了.再查看MvcRouteHandler的源代码public class MvcRouteHandler : IRouteHandler {protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext) {return new MvcHandler(requestContext);}#region IRouteHandler Members
IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext) {return GetHttpHandler(requestContext);
}#endregion
}这样在application_MapRequestHandler里面, 我们的处理程序就到了mvcHandler手里了.接下来进入到mvcHandler的ProcessRequest方法中.通过路由信息反射得出相关的controller和action, 然后再加以执行. 这就是我们的流程.至于选择controller和action的细节问题, 还需要查看高手的文章.