asp.net mvc 处理流程

回顾一下asp.net的流程处理http://www.cnblogs.com/jianjialin/archive/2011/06/14/2080768.htmlhttp://www.cnblogs.com/jianjialin/archive/2011/06/14/2080880.html

在处理流程里面有两个方法, 我们在这里分析一下

void application_PostResolveRequestCache (object sender, EventArgs e)//下文简称R
void application_MapRequestHandler(object sender, EventArgs e)//下文简称M
R, 应用程序完成缓存处理, 下一步进入映射构造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自然就是那个handler
2. 如果自定义了处理工厂, 那么处理工厂的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的细节问题, 还需要查看高手的文章.
原文地址:https://www.cnblogs.com/jianjialin/p/2097486.html