• 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的细节问题, 还需要查看高手的文章.
  • 相关阅读:
    求数组中的最小子数组,时间复杂度o(n),java
    第四周进度条
    四则混合运算3
    软件工程作业3
    《构建之法》第三周阅读笔记
    第三周学习进度
    学习进度01
    构建之法阅读笔记01
    构建之法问题
    随机生成题目运算
  • 原文地址:https://www.cnblogs.com/jianjialin/p/2097486.html
Copyright © 2020-2023  润新知